mysql - 为每组 SQL 结果获取最大值的记录
mysql - Get records with max value for each group of grouped SQL results
我指的是 2012 年来自 Yarin 的 this post。
这将不再有效,我正在使用 mysql v 8.0.19
给定如下所示的 table,包含人员、组和年龄列,您将如何获得每个组中最年长的人? (一组中的平局应给出第一个字母顺序结果)
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
您可以使用 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
已接受的链接 post 的答案不知何故让我感到困惑。它依赖于选项 ONLY_FULL_GROUP_BY
被禁用(嗯,好的,这是 MySQL 5.6 中的默认设置)。它对 MySQL 在这种情况下的行为方式做出了假设,我认为这在任何地方都没有正式记录。即使在 MySQL 5.6 中,我也不推荐这样做;令人高兴的是,another answer 获得了更多赞成票,这似乎是解决该问题的更安全的方法。
例如你可以这样做
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`)
Person | Group | Age
:----- | ----: | --:
Shawn | 1 | 42
Laura | 2 | 39
db<>fiddle here
我指的是 2012 年来自 Yarin 的 this post。
这将不再有效,我正在使用 mysql v 8.0.19
给定如下所示的 table,包含人员、组和年龄列,您将如何获得每个组中最年长的人? (一组中的平局应给出第一个字母顺序结果)
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
您可以使用 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
已接受的链接 post 的答案不知何故让我感到困惑。它依赖于选项 ONLY_FULL_GROUP_BY
被禁用(嗯,好的,这是 MySQL 5.6 中的默认设置)。它对 MySQL 在这种情况下的行为方式做出了假设,我认为这在任何地方都没有正式记录。即使在 MySQL 5.6 中,我也不推荐这样做;令人高兴的是,another answer 获得了更多赞成票,这似乎是解决该问题的更安全的方法。
例如你可以这样做
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`)
Person | Group | Age :----- | ----: | --: Shawn | 1 | 42 Laura | 2 | 39
db<>fiddle here