【问题标题】:Get row with highest or lowest value from a GROUP BY从 GROUP BY 中获取具有最高或最低值的行
【发布时间】:2013-05-30 09:21:03
【问题描述】:

在执行GROUP BY 之后,我正在尝试获取具有最高/最低数字的行:

这是我的测试数据

mysql> SELECT * FROM test;
+----+-------+------+
| id | value | name |
+----+-------+------+
|  1 |    10 | row1 |
|  2 |    12 | row2 |
|  3 |    10 | row2 |
|  4 |     5 | row2 |
+----+-------+------+
4 rows in set (0.00 sec)

要获得最低值,我将使用MIN()

mysql> SELECT id, name, MIN(value) AS value FROM test GROUP BY name;
+----+------+-------+
| id | name | value |
+----+------+-------+
|  1 | row1 |    10 |
|  2 | row2 |     5 |
+----+------+-------+
2 rows in set (0.00 sec)

现在,ID row22,但它应该是 4

我也尝试过加入:

mysql> SELECT t1.* FROM 
       (SELECT id, name, MIN(value) AS value 
          FROM test GROUP BY name) AS t1 
       INNER JOIN test AS t2 ON t1.id = t2.id;
+----+------+-------+
| id | name | value |
+----+------+-------+
|  1 | row1 |    10 |
|  2 | row2 |     5 |
+----+------+-------+
2 rows in set (0.00 sec)

如何根据最低的value 为每个结果获取正确的 ID?

【问题讨论】:

    标签: mysql sql group-by


    【解决方案1】:

    我认为这就是您想要实现的目标:

    SELECT t.* FROM test t
    JOIN 
    ( SELECT Name, MIN(Value) minVal
      FROM test GROUP BY Name
    ) t2
    ON t.Value = t2.minVal AND t.Name = t2.Name;
    

    输出:

    ID VALUE NAME
    1 10 row1
    4 5 row2

    this SQLFiddle

    在这里,我使用 minVal 和 Name 自行加入了表格。

    【讨论】:

    • 这似乎行得通,你能提一下为什么子查询不会返回id,这样我就可以了? SELECT t.* FROM test t JOIN ( SELECT id, Name, MIN(Value) minVal FROM test GROUP BY Name ) t2 ON t.id = t2.id;
    • 这些小提琴过时了吗?或者你需要做些什么才能运行它们,我总是看到一个屏幕说正在加载..并构建架构,但按下这些按钮什么也没做?
    • @veritaS 这些重复行是否有可能在任何特定列中具有不同的值?如果您可以在 SQLFiddle 中显示您的表 + 查询,那就更好了。
    • @veritaS 您是否期望 GGARTNUM='0315442' 的两条记录而不是两条记录?
    • @veritaS 使用DISTINCT 将不起作用,因为它会检查整行是否不同。您只需要指定实际不同的字段。像这样:sqlfiddle.com/#!9/8f218c/2
    猜你喜欢
    • 2014-03-22
    • 2012-11-05
    • 1970-01-01
    • 2023-01-10
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2011-08-07
    • 2021-07-10
    相关资源
    最近更新 更多