mysql组最大值行

时间:2015-03-28 20:30:43

标签: mysql group-by aggregate-functions

我有这张桌子:   - http://sqlfiddle.com/#!9/b3223/1

id  entity_id   value   date
1   1           98      March, 28 2015 19:58:43
2   1           321     March, 28 2015 19:59:54
3   1           123     March, 28 2015 19:59:54
4   2           34      March, 28 2015 20:00:43
5   2           76      March, 28 2015 20:00:44

我想列出每个date最新行(按entity_id值)。

第一个解决方案,错误的解决方案也是: - http://sqlfiddle.com/#!9/b3223/2

SELECT id, entity_id, value, MAX(  `date` ) 
FROM  `gmd` 
GROUP BY entity_id

其中一个工作解决方案似乎是: - http://sqlfiddle.com/#!9/b3223/3

SELECT id, entity_id, value,  `date` 
FROM gmd AS main
WHERE DATE = ( 
    SELECT MAX(  `date` ) 
    FROM gmd
    WHERE entity_id = main.entity_id 
) 
GROUP BY entity_id

我想知道这是否是一个可靠的解决方案,还有其他更优雅的方法可以做到这一点。

谢谢!

2 个答案:

答案 0 :(得分:1)

这是另一种方式,但正如你所看到的,有一个平局:

select id, entity_id, value, `date`
  from gmd x
  join (select entity_id, max(date) as `date` from gmd group by entity_id) y
 using (entity_id, `date`)

小提琴:http://sqlfiddle.com/#!9/b3223/11/0

在你的工作中'查询,正在选择value字段的任意(随机)值,因为它不在您的group by子句中。在大多数其他数据库中 - 除了MySQL之外 - 这将返回语法错误。

如果您不希望value的两个值在同一valueentity_id的{​​{1}}的两个值之间出现问题时返回你想如何决定带回date的哪个值?

根据评论进行编辑 - 如果你想要最后一个'在那里插入的行需要某种方式来建立超出value的顺序。假设date字段随时间而上升,您可以通过这种方式加入每个id的最大id

entity_id

小提琴:http://sqlfiddle.com/#!9/b3223/35/0

答案 1 :(得分:1)

如果您希望获得具有最高id的值,如果它们具有相同的date,则可以尝试此操作:

SELECT id, entity_id, value, 
  (SELECT MAX(`date`) FROM gmd y WHERE y.id = x.id) AS `date`
FROM  `gmd` x
GROUP BY entity_id DESC
ORDER BY id;

这是sqlfiddle