Oracle Sql:仅按id和日期选择最新记录
我的桌子看起来像这样:Oracle Sql:仅按id和日期选择最新记录,sql,oracle,greatest-n-per-group,Sql,Oracle,Greatest N Per Group,我的桌子看起来像这样: ID FROM WHEN 1 mario 24.10.19 1 robin 23.10.19 2 mario 24.10.19 3 robin 23.10.19 3 mario 22.10.19 ID FROM WHEN 1 mario 24.10.19 2 mario 24.1
ID FROM WHEN
1 mario 24.10.19
1 robin 23.10.19
2 mario 24.10.19
3 robin 23.10.19
3 mario 22.10.19
ID FROM WHEN
1 mario 24.10.19
2 mario 24.10.19
3 robin 23.10.19
我只需要ID中的最新记录。因此结果应如下所示:
ID FROM WHEN
1 mario 24.10.19
1 robin 23.10.19
2 mario 24.10.19
3 robin 23.10.19
3 mario 22.10.19
ID FROM WHEN
1 mario 24.10.19
2 mario 24.10.19
3 robin 23.10.19
我不知道如何得到这个结果有多种方法。在Oracle的三个专栏中,我很幸运地使用了
groupby
:
select id,
max("from") keep (dense_rank first order by "when" desc) as "from",
max("when") as when
from t
group by id;
在本例中,相关子查询通常执行得很好,索引位于(id,when)
:
规范的解决方案是使用窗口函数:
select t.*
from (select t.*,
row_number() over (partition by id order by "when" desc) as seqnum
from t
) t
where seqnum = 1;
Oracle有一个智能优化器,但这需要做更多的工作,因为在筛选之前,行号会分配给所有行。这可能会使它比备选方案慢一点(在某些数据库中),但它仍然是一个非常可行的解决方案