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

MySQL:基于不含节假日的日期行计算行增量

解决工作日增量计算的靠谱方案

我太懂你这个困扰了——本来想通过自连接减上一行的累计值算每日增量,但因为日期里没包含周末和节假日,周一直接减1天会碰到不存在的日期,关联不到数据,硬编码减3天又怕碰到长假失效对吧?

给你两个更稳妥的方案,完全适配你的数据结构:

方案一:用窗口函数(推荐)

如果你的数据库支持窗口函数(比如MySQL 8.0+、PostgreSQL、SQL Server等),直接用LAG()函数就搞定了,它会自动按日期排序,取到上一个工作日的累计值,根本不用管中间隔了几天:

SELECT 
    date,
    X - LAG(X, 1) OVER (ORDER BY date) AS 'Daily Total'
FROM SAMPLE;

为什么这个方法好?

  • 你的date字段已经是剔除周末和节假日的连续工作日,按date排序后,LAG(X,1)精准对应上一个工作日的记录,不管是周一还是长假后的第一天,都能正确取值
  • 比自连接写法更简洁,性能也更好,不用做表关联操作

方案二:老版本数据库用变量模拟

如果是用不支持窗口函数的老版本MySQL(比如5.x),可以用用户变量来实现:

SELECT 
    date,
    X - @prev_X AS 'Daily Total',
    @prev_X := X
FROM SAMPLE, (SELECT @prev_X := NULL) AS init
ORDER BY date;

这个写法会在遍历数据的时候,把当前行的X值存到变量里,下一行直接用当前行的X减去上一行存的变量值,同样能得到正确的每日增量。

原来的自连接写法最大的问题就是没法灵活处理节假日的间隔,比如国庆长假后第一天,减3天还是减7天?硬编码肯定会出错,而上面的两种方法都是基于表中实际存在的记录来取上一行数据,完美适配你的场景。

内容的提问来源于stack exchange,提问作者LearningSong

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:50:08