mysql - 在 MySQL 中获取 GROUP 的 MAX 行

标签 mysql group-by greatest-n-per-group

我有以下数据:

+---------+----------+----------+--------+
|      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的实例,这将为每对someidnumberdata强>. 要获得每个 someid 的唯一行,我们应该预聚合源表以使 someidnumber 对唯一(参见 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

如果我们实现独特的someidnumber 对,那么使用相关子查询是可能的。与 JOIN 不同,如果 number 的最高值重复多次,它不会产生额外的行。

关于mysql - 在 MySQL 中获取 GROUP 的 MAX 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23385748/

相关文章:

php - 不同列名的 MySQL JOIN

php - 用php更新一个字段乘以另一个字段和sql中的常量

php - 如果我要剥离标签/将它们转换为 HTML 实体,我是否需要使用 HTML Purifier?

python - 如何在Python中反转字典并从重复的键值中创建一个列表

sql - 每个 GROUP BY LIMIT SQL 查询

mysql - 时间间隔查询返回空闲时间?

sql - Teradata 按时间间隔分组

python - Groupby 和绘制条形图

sql - 从具有带键值对的 json 对象的列中查找最大值

mysql - SQL仅选择列上具有最大值的行