【问题标题】:MySQL Latest Timestamp + Other Field with Group ByMySQL最新时间戳+其他字段与Group By
【发布时间】:2013-09-27 18:53:58
【问题描述】:

我有一个表,用于存储与正在执行的任务相关的事件和时间戳。 “报告”任务是“测试”的集合,每个测试都有自己的一组事件和相关的时间戳。

结构如下:

reportID
testID
eventDateTime
eventType

每个 eventType 都类似于“开始”、“暂停”、“完成”等。我要做的是编写一个查询,告诉我对给定的 reportID/testID 组合采取的最后操作及其时间戳。

我的初步查询是:

SELECT reportID, MAX(eventDateTime), eventType
FROM testtracker_event
GROUP BY reportID, testID

结果非常接近我想要的,我得到了最新的 eventDateTime(我想要的),但它返回了第一个 eventType(而不是与最近的时间戳关联的 eventType。)

我意识到有人提出了 类似的 问题,但我已经搜索和搜索,这似乎比我发现的任何类似问题都简单得多。我想相信这在没有子查询或连接的情况下是可能的,但我的想法是基于对类似问题的回答,但逻辑更复杂。

【问题讨论】:

    标签: mysql group-by timestamp


    【解决方案1】:

    问题在于,由于 'eventType' 不是 GROUP BY 子句的一部分,因此 SELECT 子句不知道要从组中选择哪个 'eventType' 来响应查询。因此,默认情况下它通常选择第一个。大多数其他 RDBMS 系统不允许您选择未在 GROUP BY 子句中指定的字段而不应用一些聚合函数(MAX、SUM 等)。

    你可能想尝试这样的事情:

    SELECT reportID, eventDateTime, eventType
     FROM testtracker_event t
     WHERE t.eventDateTime = (
       SELECT MAX(eventDateTime) FROM testtracker_event inner_t
       WHERE t.reportID = inner_t.reportID AND t.testID = inner_t.testID
       GROUP BY reportID, testID
    )
    

    我已使用相关子查询来获取每个(reportID、testID)组合的最新时间戳,并将其用作外部查询中的比较。

    希望这行得通。

    【讨论】:

    • 在右括号后抛出一个 GROUP BY reportID, testID ,它就像一个魅力。非常感谢!
    • 哦,在最初的 SELECT 中也放了一个“testID”。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 2019-05-11
    • 1970-01-01
    • 2013-01-07
    • 2021-09-19
    • 2019-10-21
    相关资源
    最近更新 更多