【问题标题】:按日期值获取日期时间字段的最新记录
【发布时间】:2021-11-19 23:44:53
【问题描述】:

我有一张这样的桌子

id    |    start                |    Value   | Value2    | Value3
1     |    2019-01-01 22:15:02  |    A       |   P       |   C
2     |    2019-01-01 22:35:23  |    B       |   O       |   G
4     |    2019-01-02 22:35:36  |    C       |   D       |   H
5     |    2019-01-02 22:37:15  |    D       |   C       |   F
7     |    2019-01-03 17:26:36  |    C       |   K       |   M
10    |    2019-01-03 12:05:15  |    D       |   J       |   L

我有很多同一的记录,但时间不同。
我需要从DateTime 字段中选择每个day 中的最新一个。
它应该返回 ID 的记录:

id: 2 for Jan 1   
id: 5 for Jan 2nd  
id: 7 for January 3rd

试过了,没有成功:

SELECT value, value2, value3
FROM myTable AS mt
INNER JOIN (
   SELECT id, MAX(start)
   FROM myTable
   GROUP BY start
) AS b ON mt.id = b.id

我没有收到任何错误,但数据混淆了。它显示了最新的 dateTime 值,但其余字段(Value、value2、value3)是错误的。它们与最新的行不匹配。

【问题讨论】:

    标签: mysql sql greatest-n-per-group


    【解决方案1】:

    有几种可能的解决方案:

    SELECT mt.<columns>
    FROM myTable AS mt
    INNER JOIN (
       SELECT DATE(start) as start_date, MAX(start) AS start
       FROM myTable
       GROUP BY DATE(start)
    ) AS b ON mt.start = b.start;
    

    我喜欢使用排除连接。寻找在同一日期具有更大开始日期时间的另一行。不存在这样的行,则mt 必须具有给定日期的最大时间。

    SELECT mt.<columns>
    FROM myTable AS mt
    LEFT OUTER JOIN myTable AS mt2
      ON DATE(mt.start) = DATE(mt2.start) AND mt.start < mt2.start
    WHERE mt2.start IS NULL;
    

    如果您使用的是 MySQL 8.0,也可以使用窗口函数:

    SELECT * FROM (
        SELECT mt.<columns>,
          ROW_NUMBER() OVER (PARTITION BY DATE(start) ORDER BY start DESC) AS rownum
        FROM myTable AS mt
    ) AS b
    WHERE b.rownum = 1;
    

    【讨论】:

      猜你喜欢
      • 2014-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多