SQL实现叉车培训通过人数累计统计(指定日期+工作日过滤)
解决叉车培训累计通过人数统计的SQL方案
核心思路
先筛选出2023-01-26及之后的所有工作日,再针对每个工作日统计截至当天的累计通过人数,用窗口函数能高效实现累计求和逻辑。
完整SQL代码
SELECT t1.date AS work_date, SUM(COALESCE(t2.training_passed, 0)) OVER (ORDER BY t1.date) AS cumulative_passed FROM table1 t1 LEFT JOIN table2 t2 ON t2.exam_date <= t1.date WHERE t1.is_work_day = 1 AND t1.date >= '2023-01-26' GROUP BY t1.date ORDER BY t1.date;
代码细节解释
- 日期过滤:
WHERE子句里的t1.is_work_day = 1直接保留工作日数据,t1.date >= '2023-01-26'限定起始统计日期,一步过滤掉不需要的记录。 - 关联逻辑:用
LEFT JOIN关联两张表,条件设为考试日期小于等于当前工作日,确保所有在该工作日及之前通过培训的员工都被纳入统计。 - 累计求和:
SUM(COALESCE(t2.training_passed, 0)) OVER (ORDER BY t1.date)是窗口函数,按日期排序后,自动计算到当前工作日的累计通过人数。COALESCE用来处理无通过记录的工作日,返回0而非NULL。 - 排序与分组:按工作日分组保证每个日期只出现一次,最后按日期排序让结果顺序符合时间逻辑。
备选方案(兼容老版本SQL)
如果你的SQL环境不支持窗口函数,可改用子查询实现:
SELECT t1.date AS work_date, (SELECT SUM(training_passed) FROM table2 WHERE exam_date <= t1.date) AS cumulative_passed FROM table1 t1 WHERE t1.is_work_day = 1 AND t1.date >= '2023-01-26' ORDER BY t1.date;
这种方式逻辑更直观,但数据量较大时性能不如窗口函数。
内容的提问来源于stack exchange,提问作者Joe Smith
相关产品推荐
相关产品推荐

