【问题标题】:mysql - Get records with max value for each group of grouped SQL results [duplicate]mysql - 为每组分组的 SQL 结果获取具有最大值的记录[重复]
【发布时间】:2021-02-01 01:29:14
【问题描述】:

我指的是 2012 年来自 Yarin 的 this 帖子。

这将不再起作用,我使用的是 mysql v 8.0.19

给定下面这样的表格,其中包含人员、组和年龄列,您将如何获得每个组中最年长的人? (组内的平局应该给出第一个字母结果)

Person | Group | Age
---
Bob  | 1     | 32  
Jill | 1     | 34  
Shawn| 1     | 42  
Jake | 2     | 29  
Paul | 2     | 36  
Laura| 2     | 39

想要的结果集:

Shawn | 1     | 42    
Laura | 2     | 39  

【问题讨论】:

    标签: mysql sql greatest-n-per-group window-functions


    【解决方案1】:

    例如,您可以这样做

    CREATE TABLE table1 (
      `Person` VARCHAR(5),
      `Group` INTEGER,
      `Age` INTEGER
    );
    
    INSERT INTO table1
      (`Person`, `Group`, `Age`)
    VALUES
      ('Bob', '1', '32'),
      ('Jill', '1', '34'),
      ('Shawn', '1', '42'),
      ('Jake', '2', '29'),
      ('Paul', '2', '36'),
      ('Laura', '2', '39');
    
    SELECT `Person`, `Group`, `Age` FROM table1 s1 WHERE   `Age`=(SELECT MAX(s2.`Age`)
                  FROM table1 s2
                  WHERE s1.`Group` = s2.`Group`)
    
    人 |集团 |年龄 :----- | ----: | --: 肖恩 | 1 | 42 劳拉 | 2 | 39

    db小提琴here

    【讨论】:

      【解决方案2】:

      你可以使用row_number():

      select *
      from (
          select t.*, row_number() over(partition by group order by age desc, person) rn
          from mytable t
      ) t
      where rn = 1
      

      对链接帖子的接受答案不知何故让我感到困惑。它依赖于选项 ONLY_FULL_GROUP_BY 被禁用(好吧,这是 MySQL 5.6 中的默认设置)。它对 MySQL 在这种情况下的行为方式做出了假设,我认为这在任何地方都没有正式记录。即使在 MySQL 5.6 中,我也不建议这样做;令人高兴的是,another answer 得到了更多的支持,这似乎是解决问题的更安全的方法。

      【讨论】:

      • 太快了!谢谢!
      猜你喜欢
      • 2018-03-30
      • 2019-07-30
      • 1970-01-01
      • 2011-02-09
      • 2018-11-21
      • 1970-01-01
      • 2021-09-01
      相关资源
      最近更新 更多