【问题标题】:SQL: Select id from table grouping by max year and nameSQL:按最大年份和名称从表分组中选择 id
【发布时间】:2023-03-12 22:05:01
【问题描述】:

我有以下数据:

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

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

【问题讨论】:

    标签: sql postgresql


    【解决方案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;
    

    【讨论】:

      【解决方案2】:

      可以使用按名称分区并按年份和 ID desc 排序的 row_number() 分析来获取最大日期的最大 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 年,那么这两条记录都将被返回。

      【讨论】:

      • 让我测试一下,什么是RN?
      • 你的陈述中有多余的“)”吗?
      • 我收到一个错误:FROM 中的子查询必须有别名
      • RN 是行号是'列别名。是的,有一个额外的),我在子查询中添加了一个别名。
      猜你喜欢
      • 2020-12-31
      • 2019-05-02
      • 2015-04-08
      • 1970-01-01
      • 2014-01-30
      • 1970-01-01
      • 2020-11-16
      • 1970-01-01
      • 2021-02-18
      相关资源
      最近更新 更多