【问题标题】:Mysql group by date part of datetime and select rows with max datetime for each dateMysql按日期时间的日期部分分组,并为每个日期选择具有最大日期时间的行
【发布时间】:2022-01-18 07:28:52
【问题描述】:

我的数据看起来像,

表 - usr_weight

user_id weight log_time
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 条记录,但该行不是 max(log_time)。

【问题讨论】:

    标签: mysql datetime group-by


    【解决方案1】:

    使用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;
    

    【讨论】:

    • 你的速度太快了!看到您在几秒钟/几分钟内编写出多个解决方案,真是令人鼓舞。
    • @zedfoxus LOL...我现在正在玩手机。在笔记本电脑上会快得多。
    • @TimBiegeleisen where 要在 with 查询中添加条件。
    • 我添加了WHERE 逻辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多