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

演示

您可以使用窗口函数:

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的所有行。您可以在第一个查询中使用rank()来获取该行为
  • 这不会返回NULLid值或ids,其中time一致为NULL。第一个查询确实如此

相关内容

  • 没有找到相关文章

最新更新