具有每组最大值的行

时间:2015-11-13 20:39:49

标签: mysql sql aggregate-functions greatest-n-per-group

我试图获取每组中具有最大值的行。

我有这张桌子

+-------+-----------+--------------+-----------+
|  nid  |     name  |   crated     | grp_id    |
+-------+-----------+--------------+-----------+
|  1    | RAND_NAME |     123      |        11 |
|  2    | EHllo     |     111      |        11 |
|  3    | Stop by   |     444      |        11 |
|  4    | Radr c    |     555      |        11 |
|  5    | NAE       |     666      |        22 |
|  6    | ABC       |     1234     |        22 |
|  7    | RAND      |     123      |        22 |
|  8    | YELLO     |     444      |        22 |
|  9    | AAA       |     555      |        33 |
|  10   | WWW       |     1235     |        33 |
|  11   | ADF       |     553      |        33 |
+-------+-----------+--------------+-----------+

所以,我想要这张表

+-------+-------------+------------+-----------+
| nid   |     name    |  created   | grp_id    |
+-------+-------------+------------+-----------+
|   3   | Radr c      |   555      |        11 |
|   6   | ABC         |   1234     |        22 |
|  10   | WWW         |   1235     |        33 |
+-------+-------------+------------+-----------+

这意味着我想获取每组中创建值最高的行。该表将按grp_id分组。

我这样想:

SELECT nid, name, created, grp_id
   FROM table t
   WHERE t.created = (SELECT MAX(t1.created) FROM table t1)
   GROUP BY grp_id
   ORDER BY grp_id

但是,它没有成功。如何获得每组中创建值最高的三个不同的行?

感谢您理解我的不良解释。

3 个答案:

答案 0 :(得分:1)

您需要一个子选择:

SELECT yourtable.*
FROM yourtable
LEFT JOIN (
    SELECT grp_id, MAX(created) AS max
    FROM yourtable
    GROUP BY grp_id
) AS maxgroup ON (
    (yourtable.grp_id = maxgroup.grp_id) AND (yourtable.created = maxgroup.max)
)

子选择获取每个组的ID / max值,并且父/外部查询再次连接子选择结果,以获得最大值出现的行的其余字段。

答案 1 :(得分:0)

尝试:

SELECT nid, name, MAX(created), grp_id FROM t GROUP BY grp_id;

答案 2 :(得分:0)

SELECT nid, name, MAX(created), grp_id
FROM table
GROUP BY grp_id
order by MAX(nid);