我正在尝试编写一个只返回行的查询,哪个时间对每个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()
来获取该行为 - 这不会返回
NULL
id
值或id
s,其中time
一致为NULL
。第一个查询确实如此