如何在MySQL中查询各用户首次与末次选择的配送日
实现方案
以下三种方案均可实现需求,可根据你的MySQL版本和业务场景选择:
方案1:兼容所有MySQL版本(聚合+关联查询,稳定性最高)
核心用到的函数:MIN()、MAX()、GROUP BY、JOIN
SELECT t.user_id, t1.Day AS first_day, t2.Day AS last_day FROM ( -- 先统计每个用户的最早、最晚更新时间 SELECT user_id, MIN(DateUpdate) AS min_date, MAX(DateUpdate) AS max_date FROM 你的表名 -- 替换为实际表名 GROUP BY user_id ) t -- 关联取首次选择的配送日 JOIN 你的表名 t1 ON t.user_id = t1.user_id AND t.min_date = t1.DateUpdate -- 关联取最后一次选择的配送日 JOIN 你的表名 t2 ON t.user_id = t2.user_id AND t.max_date = t2.DateUpdate ORDER BY t.user_id;
方案2:MySQL 8.0+ 窗口函数写法(性能更优,代码更简洁)
核心用到的函数:ROW_NUMBER()、CASE WHEN、GROUP BY
SELECT user_id, MAX(CASE WHEN rn_asc = 1 THEN Day END) AS first_day, MAX(CASE WHEN rn_desc = 1 THEN Day END) AS last_day FROM ( SELECT user_id, Day, -- 每个用户的记录按更新时间正序排名 ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY DateUpdate ASC) AS rn_asc, -- 每个用户的记录按更新时间倒序排名 ROW_NUMBER() OVER(PARTITION BY user_id ORDER BY DateUpdate DESC) AS rn_desc FROM 你的表名 -- 替换为实际表名 ) t WHERE rn_asc = 1 OR rn_desc = 1 GROUP BY user_id ORDER BY user_id;
方案3:小数据量快速写法
核心用到的函数:GROUP_CONCAT()、SUBSTRING_INDEX()
注:仅适合用户变更次数少的场景,GROUP_CONCAT()默认有1024字节长度限制,变更次数多会截断数据
SELECT user_id, SUBSTRING_INDEX(GROUP_CONCAT(Day ORDER BY DateUpdate ASC), ',', 1) AS first_day, SUBSTRING_INDEX(GROUP_CONCAT(Day ORDER BY DateUpdate DESC), ',', 1) AS last_day FROM 你的表名 -- 替换为实际表名 GROUP BY user_id ORDER BY user_id;
内容的提问来源于stack exchange,提问作者Florencia Mo
相关产品推荐
相关产品推荐

