mysql 分组最大值行
mysql group max value rows
我有这个table:
- 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
我想为每个 entity_id
.
列出 最新行 (按 date
值)
第一种解法,错误的也是:- 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
我想知道这是否是一个可靠的解决方案,是否还有其他更优雅的方法。
谢谢!
这是另一种方式,但如您所见,有一条平局:
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`)
Fiddle: http://sqlfiddle.com/#!9/b3223/11/0
在您的 'working' 查询中,选择了 value
字段的任意(随机)值,因为它不在您的 group by
子句中。在大多数其他数据库中——除了 MySQL——这将是 return 语法错误。
如果您不希望 value
的两个值在相同 entity_id
和 date
的 value
的两个值之间出现平局时返回你想如何决定要带回 value
的哪个值?
根据评论编辑 --
如果您想要插入 'last' 行,则需要某种方式来建立 date
之外的顺序。假设 id
字段随时间上升,您可以通过这种方式为每个 entity_id
加入最大值 id
:
select id, entity_id, value, `date`
from gmd x
join (select entity_id, max(id) as id from gmd group by entity_id) y
using (entity_id, id)
如果你总是想获得具有最高 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.
我有这个table: - 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
我想为每个 entity_id
.
date
值)
第一种解法,错误的也是:- 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
我想知道这是否是一个可靠的解决方案,是否还有其他更优雅的方法。
谢谢!
这是另一种方式,但如您所见,有一条平局:
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`)
Fiddle: http://sqlfiddle.com/#!9/b3223/11/0
在您的 'working' 查询中,选择了 value
字段的任意(随机)值,因为它不在您的 group by
子句中。在大多数其他数据库中——除了 MySQL——这将是 return 语法错误。
如果您不希望 value
的两个值在相同 entity_id
和 date
的 value
的两个值之间出现平局时返回你想如何决定要带回 value
的哪个值?
根据评论编辑 --
如果您想要插入 'last' 行,则需要某种方式来建立 date
之外的顺序。假设 id
字段随时间上升,您可以通过这种方式为每个 entity_id
加入最大值 id
:
select id, entity_id, value, `date`
from gmd x
join (select entity_id, max(id) as id from gmd group by entity_id) y
using (entity_id, id)
如果你总是想获得具有最高 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.