MySQL从多个获取最后的日期记录

时间:2013-10-22 09:54:04

标签: mysql datetime greatest-n-per-group

我的数据库中有以下内容:

ID      datetime             type   value
1094    2013-09-25 09:11:18  HDD      89%
1094    2013-09-25 09:11:18  CPU      55%
1093    2013-09-25 09:11:18  HDD      77%
1093    2013-09-25 09:11:18  CPU      55%
1094    2013-09-25 08:21:28  HDD      85%
1094    2013-09-25 08:21:28  CPU      11%
1093    2013-09-25 07:04:00  HDD      76%

我想获取每个ID和类型记录的最后日期:

1094    2013-09-25 09:11:18  HDD      89%
1094    2013-09-25 09:11:18  CPU      55%
1093    2013-09-25 09:11:18  HDD      77%
1093    2013-09-25 09:11:18  CPU      55%

2 个答案:

答案 0 :(得分:15)

可以使用GROUP BY,但了解其工作原理非常重要。

当您使用GROUP BY时,一组行被折叠为一个,而在GROUP BY子句中未使用的其他列中显示的内容将通过使用聚合函数确定,或者它是随机排出该组。您无法确保获取与显示的行对应的行,其中包含MAX()值或您使用的任何聚合函数。当您执行以下查询时,这一点尤为明显:

SELECT id, MIN(whatever), MAX(whatever), another_column
FROM your_table
GROUP BY id

“another_column”可以属于包含MIN()值或MAX()值的行,甚至可以属于根本不显示的另一行。在除MySQL之外的其他RDBMS中,实际上禁止选择不使用聚合函数或未在GROUP BY子句中列出的列,只是为了防止用户犯错误或认为他们得到了正确的结果。

因此,在您的情况下,您似乎也希望显示“值”列。由于上述原因,juergen_d的答案是错误的,因为它没有选择“值”,如果可以的话,你不能确定它是正确的“价值”。菲利普席尔瓦的回答是错误的,因为它按“价值”分组。这样做会在你的情况下实际返回整个表。 Romesh的答案是错误的,因为使用MAX()函数两次会得到最大值,显然不是与datetime值对应的值。

那么,你怎么做呢? Here 3 ways are described。通过自己应用它们来学习它们。这并不难:)

答案 1 :(得分:3)

select id, type, max(datetime)
from your_table
group by id, type