以下是可能最简单的例子,尽管任何解决方案都应该能够扩展到所需的多个顶级结果:
给出下面这样的表格,包括个人、组和年龄列,你会怎么做?每组中有两个年龄最大的人?(组内的联系不应产生更多的结果,而应按字母顺序给出前2)
+--------+-------+-----+
| Person | Group | Age |
+--------+-------+-----+
| Bob | 1 | 32 |
| Jill | 1 | 34 |
| Shawn | 1 | 42 |
| Jake | 2 | 29 |
| Paul | 2 | 36 |
| Laura | 2 | 39 |
+--------+-------+-----+
期望的结果集:
+--------+-------+-----+
| Shawn | 1 | 42 |
| Jill | 1 | 34 |
| Laura | 2 | 39 |
| Paul | 2 | 36 |
+--------+-------+-----+
注:这个问题建立在前一个问题的基础上-获取每组成组SQL结果的最大值记录-从每一组中得到一个顶部行,并获得了一个非常好的MySQL特定的答案:
select *
from (select * from mytable order by `Group`, Age desc, Person) x
group by `Group`
我很想建立这个基础,虽然我不知道该怎么做。
发布于 2018-03-28 17:08:27
在其他数据库中,可以使用ROW_NUMBER
。MySQL不支持ROW_NUMBER
但是你可以使用变量来模拟它:
SELECT
person,
groupname,
age
FROM
(
SELECT
person,
groupname,
age,
@rn := IF(@prev = groupname, @rn + 1, 1) AS rn,
@prev := groupname
FROM mytable
JOIN (SELECT @prev := NULL, @rn := 0) AS vars
ORDER BY groupname, age DESC, person
) AS T1
WHERE rn <= 2
https://stackoverflow.com/questions/-100007841
复制相似问题