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
相关产品推荐
相关产品推荐

