代码之家  ›  专栏  ›  技术社区  ›  user1578872

Mysql按日期时间的日期部分进行分组,并为每个日期选择具有最大日期时间的行

  •  0
  • user1578872  · 技术社区  · 3 年前

    我的数据看起来像,

    表-usr_weight

    user_id 重量 日志时间
    1. 10 2021-11-30 10:29:03
    1. 12 2021-11-30 12:29:03
    1. 11 2021-11-30 14:29:03
    1. 18 2021-12-01 08:29:03
    1. 12 2021-12-15 13:29:03
    1. 14 2021-12-15 17:29:03

    在这里,我有不同时间的每个日期的副本。因此,分组日期并返回每个日期的最长时间记录。

    查询

    select weight, log_time from usr_weight where user_id = 1 group by DATE(log_time)
    

    在这里,我为每个日期获得1条记录,但该行不是最大值(log_time)。

    1 回复  |  直到 3 年前
        1
  •  3
  •   Tim Biegeleisen    3 年前

    使用 ROW_NUMBER 我们可以尝试:

    WITH cte AS (
        SELECT *, ROW_NUMBER() OVER (PARTITION BY DATE(log_time)
                                     ORDER BY log_time DESC) rn
        FROM usr_weight
        WHERE user_id = 1
    )
    
    SELECT user_id, weight, log_time
    FROM cte
    WHERE rn = 1;
    

    这里有一种老派的加入方式:

    SELECT uw1.user_id, uw1.weight, uw1.log_time
    FROM usr_weight uw1
    INNER JOIN
    (
        SELECT DATE(log_time) AS log_time_date, MAX(log_time) AS max_log_time
        FROM usr_weight
        WHERE user_id = 1
        GROUP BY DATE(log_time)
    ) uw2
         ON uw2.log_time_date = DATE(uw1.log_time) AND
            uw2.max_log_time = uw1.log_time
    WHERE
        uw1.user_id = 1;