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 all 行 id
。您可以在第一个查询中使用 rank()
获得该行为。
- 这不会 return
NULL
id
值或 id
s 其中 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
我正在尝试编写一个查询,该查询将 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 all 行id
。您可以在第一个查询中使用rank()
获得该行为。 - 这不会 return
NULL
id
值或id
s 其中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