求SQL按年月分组实现剩余加班时长计算(基于Lag函数)
实现剩余加班时长计算的SQL语句
核心思路
要按Year和Month分组递推计算剩余加班时长,无需使用LAG()函数,直接通过累计窗口函数计算累计使用时长,再用初始值(15.5)减去累计值即可得到当前行的剩余时长,逻辑更简洁稳定。
假设表结构
假设你的加班记录表名为overtime_records,包含以下字段:
year:年份month:月份number_of_used:当月已使用的加班时长record_seq:记录的顺序标识(用于确定行的计算先后,若没有该字段,可替换为实际的排序字段如记录日期record_date)
最终SQL语句
SELECT year, month, number_of_used, -- 初始剩余15.5减去当前行及之前的累计使用时长,得到当前剩余 15.5 - SUM(number_of_used) OVER ( PARTITION BY year, month ORDER BY record_seq ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS number_of_left FROM overtime_records ORDER BY year, month, record_seq;
语句说明
PARTITION BY year, month:将数据按年份和月份分组,每个分组内独立计算剩余时长ORDER BY record_seq:指定分组内行的计算顺序,确保累计逻辑的正确性(必须有明确的排序字段,否则行顺序随机会导致结果错误)SUM(number_of_used) OVER (...):计算从分组第一行到当前行的累计已使用加班时长15.5 - 累计值:得到当前行的剩余可使用加班时长,完全匹配你描述的递推逻辑(第一行15.5-1=14.5,第二行15.5-(1+2)=12.5,以此类推)
内容的提问来源于stack exchange,提问作者Poslovna Podrška
相关产品推荐
相关产品推荐

