【问题标题】:MySQL get last date records from multipleMySQL从多个获取最后日期记录
【发布时间】:2013-10-31 03:02:01
【问题描述】:

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

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 datetime greatest-n-per-group


【解决方案1】:

可以使用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() 函数会得到最大值,但显然不是日期时间值对应的值。

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

【讨论】:

    【解决方案2】:
    select id, type, max(datetime)
    from your_table
    group by id, type
    

    【讨论】:

    • 请注意 Juergen 的回答是错误的(下面由 fancyPants 进一步解释)。
    猜你喜欢
    • 2014-03-10
    • 1970-01-01
    • 1970-01-01
    • 2012-02-13
    • 2020-03-02
    • 2015-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多