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有一个智能优化器,但这需要做更多的工作,因为在筛选之前,行号会分配给所有行。这可能会使它比备选方案慢一点(在某些数据库中),但它仍然是一个非常可行的解决方案