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

标签 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%

最佳答案

可以使用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 的答案是错误的,因为它没有选择“值”,如果选择了,你不能确定它是正确的“值”。 Filipe Silva 的回答是错误的,因为它按“值(value)”分组。在您的情况下,这样做实际上会返回整个表。 Romesh 的回答是错误的,因为使用两次 MAX() 函数会得到最大值,显然不是与日期时间值对应的值。

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

关于MySQL从多个获取最后日期记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19514532/

相关文章:

mysql - 如何将两个表与另一个第三个表中的公共(public)列连接起来?

mysql - 日期时间比较mysql

mysql - 在mysql中获取24小时后的日期

php - MYSQL 查询 - 获取与帖子相关的最新评论

mysql - 从范围中选择最大值

mysql - 如何在此查询中获得 DISTINCT

php - 使用 PHP 从 SQL 查询创建一个没有重复行的 HTML 表?

sql - 返回具有相同 ref_id 的每个元素的最后金额

php - 将服务器端 MySQL 数据库传输到 iOS

php - Symfony 断言日期时间 JMSSerializer