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