SQL:从表格分组中选择最大年份和名称

时间:2017-10-16 12:28:41

标签: sql postgresql

我有以下数据:

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

理想情况下,应该没有重复的年份和名称组,但如果有重复的记录,则可能。由于它们是重复的,因此保留哪个并不重要。

2 个答案:

答案 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年,那么将返回两个记录。