我有以下数据:
+---------+----------+----------+--------+
| id | someId | number | data |
+---------+----------+----------+--------+
| 27 | 123 | 1 | abcde1 |
| 28 | 123 | 3 | abcde2 |
| 29 | 123 | 1 | abcde3 |
| 30 | 123 | 5 | abcde4 |
| 31 | 124 | 4 | abcde1 |
| 32 | 124 | 8 | abcde2 |
| 33 | 124 | 1 | abcde3 |
| 34 | 124 | 2 | abcde4 |
| 35 | 123 | 16 | abcde1 |
| 245 | 123 | 3 | abcde2 |
| 250 | 125 | 0 | abcde3 |
| 251 | 125 | 1 | abcde4 |
| 252 | 125 | 7 | abcde1 |
| 264 | 125 | 0 | abcde2 |
| 294 | 123 | 0 | abcde3 |
| 295 | 126 | 0 | abcde4 |
| 296 | 126 | 0 | abcde1 |
| 376 | 126 | 0 | abcde2 |
+---------+----------+----------+--------+
我想获得一个 MySQL 查询,为每个 someId 获取具有最高 number 的行的数据。请注意,id 是唯一的,但 number 不是
最佳答案
SELECT someid, highest_number, data
FROM test_1
INNER JOIN (SELECT someid sid, max(number) highest_number
FROM test_1
GROUP BY someid) t
ON (someid=sid and number=highest_number)
不幸的是,它看起来效率不高。在 Oracle 中,可以在没有子查询的情况下使用 OVER 子句,但是 MySQL ......
更新 1
如果有多个最高number的实例,这将为每对someid和number返回多个data强>. 要获得每个 someid 的唯一行,我们应该预聚合源表以使 someid 和 number 对唯一(参见 t1 子查询)
SELECT someid, highest_number, data
FROM
(SELECT someid, number, MIN(data) data
FROM test_1
GROUP BY
someid, number) t1
INNER JOIN
(SELECT someid sid, max(number) highest_number
FROM test_1
GROUP BY someid) t2
ON (someid=sid and number=highest_number)
更新 2
可以简化之前的解决方案
SELECT someid,highest_nuimber,
(select min(data)
from test_1
where someid=t1.someid and number=highest_nuimber)
FROM
(SELECT someid, max(number) highest_nuimber
FROM test_1
GROUP BY someid) t1
如果我们实现独特的someid 和number 对,那么使用相关子查询是可能的。与 JOIN 不同,如果 number 的最高值重复多次,它不会产生额外的行。
关于mysql - 在 MySQL 中获取 GROUP 的 MAX 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23385748/