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%
4

2 回答 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子句中列出的列,只是为了防止用户犯错误或认为他们得到了正确的结果。

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

那么,你必须怎么做呢?这里介绍了 3 种方式。通过自己应用它们来学习它们。这并不难:)

于 2013-10-22T10:19:47.637 回答
3
select id, type, max(datetime)
from your_table
group by id, type
于 2013-10-22T09:57:42.403 回答