Mysql按日期时间的日期部分分组,并为每个日期选择具有最大日期时间的行
Posted
技术标签:
【中文标题】Mysql按日期时间的日期部分分组,并为每个日期选择具有最大日期时间的行【英文标题】:Mysql group by date part of datetime and select rows with max datetime for each date 【发布时间】: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)。
【问题讨论】:
【参考方案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
逻辑。以上是关于Mysql按日期时间的日期部分分组,并为每个日期选择具有最大日期时间的行的主要内容,如果未能解决你的问题,请参考以下文章
SQL - 如何在一年中的每个日期按年龄和状态对项目进行分组/计数 - 第 2 部分
Python Pandas:按日期分组,并按时间戳访问每个组