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

3

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

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%

这是获取分组MySQL数据的最新日期的副本,但是fancyPants在这里的答案比旧问题中的答案更好。 - Dan Dascalescu
2个回答

16

可以使用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子句中的列实际上是被禁止的,这是为了防止用户犯错或认为他们得到了正确的结果。

因此,在您的情况下,您似乎也想显示“value”列。由于以上原因,juergen_d的答案是错误的,因为它没有选择“value”,即使选择了,“value”是否正确也无法确定。Filipe Silva的答案是错误的,因为它按“value”分组。在您的情况下,这样做实际上会返回整个表。Romesh的答案是错误的,因为两次使用MAX()函数将获得最大值,但显然不会得到对应于日期时间值的值。

那么,您该如何做呢?这里描述了3种方法。通过自己应用它们来学习它们。这并不难 :)


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

3
请注意,Juergen的回答是错误的(根据fancyPants的进一步解释)。 - fuji2015

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接