我有以下数据:
ID Year Name
1 2016 A
2 2015 A
3 2014 A
4 2014 B
5 2015 B
6 2010 C
7 2007 D
8 2008 D
9 2006 D
我只需查询每个名称组的最大日期ID 结果:[1,5,6,8]
这是真的:
ID Year Name
1 2016 A
5 2015 B
6 2010 C
8 2008 D
我有以下内容,但不知道从哪里开始
SELECT MAX(year) from table GROUP BY name
理想情况下,应该没有重复的年份和名称组,但如果有重复的记录,则可能。由于它们是重复的,因此保留哪个并不重要。
答案 0 :(得分:1)
如果您想要每name
行一行,那么我建议distinct on
:
select distinct on (name) t.*
from t
order by name, year desc;
如果您有重复项,那么一个解决方案是rank()
:
select id, year, name
from (select t.*, rank() over (partition by name order by year desc) as seqnum
from t
) t
where seqnum = 1;
答案 1 :(得分:0)
可以使用按名称分区的row_number()分析,并按年份和ID desc排序,以获取最大日期的最大ID。您没有表明是否存在您想要看到的关系......但这会返回其中一个(ID最高的那个)。
SELECT *
FROM (SELECT ID
, year
, Name
, row_number() over (PARTITION BY Name ORDER BY Year Desc, ID Desc) RN
FROM tbl) Z
WHERE RN = 1
另一种方法是将您的查询用作内联视图,然后将其简单地连接回基本集。
SELECT *
FROM tbl A
INNER JOIN (SELECT max(year) mYear, name
FROM tbl
GROUP BY name) B
on A.year = B.myear
and A.Name = B.Name
将显示领带。因此,如果您有一个名称,其中两个记录的最大年份为2016年,那么将返回两个记录。