Sql 按最近6周对记录进行分组,根据oracle中的日期查找最新记录

Sql 按最近6周对记录进行分组,根据oracle中的日期查找最新记录,sql,oracle,Sql,Oracle,我需要帮助来创建一个sql查询,以便在基于数据分散中的日期进行排序后获得前6周的最新序列记录。 我可以做一个月,没有任何问题。但在过去的六个星期里,我想不出一个方法来做到这一点。我读到可以使用前一行和当前行之间的范围来实现这一点,但我没有成功 这是一个示例数据: 资料来源:20年2月21日至20年4月3日之间的随机数据(从当天起前六周) 排名以根据日期描述查找最近的记录,按序列分组: Serial Repair_dt rank 1 3-Apr-20 1 1 1

我需要帮助来创建一个sql查询,以便在基于数据分散中的日期进行排序后获得前6周的最新序列记录。 我可以做一个月,没有任何问题。但在过去的六个星期里,我想不出一个方法来做到这一点。我读到可以使用前一行和当前行之间的范围来实现这一点,但我没有成功

这是一个示例数据:

资料来源:20年2月21日至20年4月3日之间的随机数据(从当天起前六周)

排名以根据日期描述查找最近的记录,按序列分组:

Serial  Repair_dt   rank
1       3-Apr-20    1
1       12-Mar-20   2
2       12-Mar-20   1
3       12-Mar-20   1
4       2-Apr-20    1
4       2-Apr-20    2
4       1-Mar-20    3
4       28-Feb-20   4
5       19-Mar-20   1
5       23-Feb-20   2
6       1-Mar-20    1
最终输出:

Serial  Repair_dt   rank
1       3-Apr-20    1
2       12-Mar-20   1
3       12-Mar-20   1
4       2-Apr-20    1
5       19-Mar-20   1
6       1-Mar-20    1
谢谢你的帮助

谢谢。
Kav

你真的不需要排名。聚合适用于您描述的数据:

select serial, max(repair_dt) as repair_dt
from t
where repair_dt > sysdate - interval '42' day
group by serial;
如果需要整行,则:

select t.*
from t
where t.repair_dt = (select max(t2.repair_dt)
                     from t t2
                     where t2.serial = t.serial and
                           t2.repair_dt > sysdate - interval '42' day
                    );
或:


谢谢你的快速回复。但是上面的查询是过去6个月的,对吗?在过去的6周里,我一直想这样做。我确实尝试用trunc(sysdate)-(6*7)替换add_months(sysdate,-6),但我得到了空记录。@KavinPalaniswamy。我修复了它。我只是从dual中选择了一个sysdate-interval'6'周;并得到一系列错误:
ORA-30089:缺少或无效30089。00000-“丢失或无效”*原因:A(年、月、日、小时、分钟、秒)应为但未找到,或者A中指定的A比其更重要。
@KavinPalaniswamy。我不知道Oracle不支持
week
(大多数数据库都支持)。在任何情况下,这都是有效的:
从dual选择sysdate-interval'42'day
@KavinPalaniswamy。这将针对第二个问题。另一种方法是使用
行编号()
。第一个查询不能返回重复项。
select t.*
from t
where t.repair_dt = (select max(t2.repair_dt)
                     from t t2
                     where t2.serial = t.serial and
                           t2.repair_dt > sysdate - interval '42' day
                    );
select t.*
from (select t.*,
             row_number() over (partition by serial order by repair_dt desc) as seqnum
      from t
      where t2.repair_dt > sysdate - interval '42' day
     ) t
where seqnum = 1;