MySQL中如何获取以周一为起始的每周最后一条数据
在MySQL中获取每周(周一为起始)的最后一条记录值
要解决这个按周一作为一周起始、获取每周最后一个对应值的问题,我们可以根据你的MySQL版本选择两种实用的方法:
方法1:分组关联法(兼容所有MySQL版本)
这种方法通过子查询先找出每周的最后一天,再关联原表获取对应的值,适合所有版本的MySQL:
SELECT t.day AS Day, t.value AS Value FROM your_table t INNER JOIN ( -- 按年+周分组,找出每周的最后一天 SELECT YEAR(day) AS year_num, WEEK(day, 1) AS week_num, -- 模式1指定周一为一周的第一天 MAX(day) AS last_day_of_week FROM your_table GROUP BY year_num, week_num ) AS week_summary ON t.day = week_summary.last_day_of_week ORDER BY t.day;
关键细节解释:
WEEK(day, 1):这个函数的第二个参数1是核心,它告诉MySQL将周一作为一周的起始日,周日作为结束日,确保分组逻辑符合你的需求。- 加上
YEAR(day)分组:避免跨年时的周被错误合并(比如12月底的最后一周和1月初的第一周,年份不同应该分开处理)。 MAX(day):在每个周分组里取最大的日期,也就是该周的最后一天,再通过关联拿到对应的值。
方法2:窗口函数法(MySQL 8.0+适用)
如果你的MySQL版本是8.0及以上,使用窗口函数会更简洁直观:
SELECT day AS Day, value AS Value FROM ( SELECT day, value, -- 按年+周分区,每个分区内按日期倒序排序,标记行号 ROW_NUMBER() OVER (PARTITION BY YEAR(day), WEEK(day, 1) ORDER BY day DESC) AS rn FROM your_table ) t WHERE rn = 1 -- 取每个分区的第一行,也就是日期最晚的那条记录 ORDER BY day;
逻辑说明:
PARTITION BY YEAR(day), WEEK(day, 1):把数据按“年份+周”分成不同的组(分区)。ORDER BY day DESC:在每个分区内按日期从晚到早排序,这样每周的最后一条记录会排在第一位。ROW_NUMBER()给每条记录标记行号,筛选rn=1就得到了每周的最后一个值。
验证结果
把你的示例数据代入上述任一方法,都会得到预期的结果:
Day Value
2018-03-16 62
2018-03-21 102
2018-03-29 132
内容的提问来源于stack exchange,提问作者J. Ordaz
相关产品推荐
相关产品推荐

