ORACLE SQL查找每个分组的最大日期行

问题描述

我正在尝试编写一个查询,该查询将仅返回所有ID值最大的行

Table: positions
id          time       otherCols...
---------- ----------- ----------
1           1     
1           2      
3           1      
1           3      
2           1       
3           2       

结果应如下所示:

id          time       otherCols...
---------- ----------- ----------      
1           3      
2           1       
3           2    

我尝试了按ID分组,但我不知道该如何对它进行排序并仅选择最重要的结果。

解决方法

您可以使用MAX(..) KEEP (DENSE_RANK ..) OVER (PARTITION BY ..)分析函数,而无需任何子查询:

SELECT MAX(time) KEEP (DENSE_RANK LAST ORDER BY time) 
                 OVER (PARTITION BY id) AS time_max,p.*
  FROM positions p
 ORDER BY id

Demo

,

您可以使用窗口功能:

select t.*
from (select t.*,row_number() over (partition by id order by time desc) as seqnum
      from t
     ) t
where seqnum = 1;

另一种方法是相关子查询:

select t.*
from t
where t.time = (select max(t2.time) from t t2 where t2.id = t.id);

这与第一个查询在两个方面不同:

  • 如果id有重复的时间,则返回id all 行。您可以在第一个查询中使用rank()来获得该行为。
  • 这不会返回NULL id个值或id统一为time的{​​{1}}个值。第一个查询。