问题描述
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
的 all 行。您可以在第一个查询中使用rank()
来获得该行为。 - 这不会返回
NULL
id
个值或id
统一为time
的{{1}}个值。第一个查询。