需求:创建遇Null重置的累计求和列及指定字段新表
解决方案
我们可以通过构造分组标识实现遇到Null值时重置累计求和的需求,再结合窗口函数计算分组内的累计值。以下是针对主流SQL数据库(MySQL 8.0+/PostgreSQL/SQL Server)的实现代码:
-- 创建包含sum列的新表 CREATE TABLE new_production_table AS WITH grouped_data AS ( SELECT linekey, machinekey, starttime, endtime, date, productioncountwotearoff, -- 构造分组:每遇到productioncountwotearoff为Null,分组编号+1 SUM(CASE WHEN productioncountwotearoff IS NULL THEN 1 ELSE 0 END) OVER (ORDER BY date, starttime) AS group_id FROM your_original_table ) SELECT linekey, machinekey, starttime, endtime, date, -- 分组内累计求和,Null值对应sum按0计算(可按需调整为Null) SUM(CASE WHEN productioncountwotearoff IS NOT NULL THEN productioncountwotearoff ELSE 0 END) OVER (PARTITION BY group_id ORDER BY date, starttime) AS sum FROM grouped_data ORDER BY date, starttime;
关键逻辑说明:
- 分组标识group_id:通过
SUM(CASE...) OVER(ORDER BY...)计算,每当遇到productioncountwotearoff为Null时,分组编号递增,以此划分出独立累计的区间。 - 累计求和sum:使用
SUM(CASE...) OVER(PARTITION BY group_id ORDER BY...),在每个分组内按时间顺序累计非Null的productioncountwotearoff值;若需要Null对应的sum值保持为Null,可将CASE表达式中的0改为productioncountwotearoff。 - 新表生成:通过
CREATE TABLE...AS语句直接将结果存入新表new_production_table,可根据实际需求修改表名。
如果你的数据库不支持CTE(如MySQL 5.x),可改用子查询实现:
CREATE TABLE new_production_table AS SELECT linekey, machinekey, starttime, endtime, date, SUM(CASE WHEN productioncountwotearoff IS NOT NULL THEN productioncountwotearoff ELSE 0 END) OVER (PARTITION BY group_id ORDER BY date, starttime) AS sum FROM ( SELECT linekey, machinekey, starttime, endtime, date, productioncountwotearoff, SUM(CASE WHEN productioncountwotearoff IS NULL THEN 1 ELSE 0 END) OVER (ORDER BY date, starttime) AS group_id FROM your_original_table ) AS sub ORDER BY date, starttime;
注意:请将代码中的your_original_table替换为实际原始表名;ORDER BY date, starttime需根据数据时间逻辑调整,确保累计顺序正确。
内容的提问来源于stack exchange,提问作者Inimitableguy
相关产品推荐
相关产品推荐

