You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:35:42