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

ORACLE SQL find row with max date for each grouping

我正在尝试编写一个查询,该查询将 return 只有行,其中时间对每个 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 分组,但我不知道如何排序,只能选择最靠前的结果。

您可以使用 window 函数:

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 有重复的时间,那么 returns allid。您可以在第一个查询中使用 rank() 获得该行为。
  • 这不会 return NULL id 值或 ids 其中 time 统一为 NULL。第一个查询。

您可以使用 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