如何在DB2中关联两表计算按ID分区的近90天数值总和?
DB2中实现按ID分区计算近90天value总和的方案
针对你的需求,以下是几种在DB2中实现的方式:
1. 直接查询得到包含新列的结果(无需修改原表)
如果只是需要获取预期的查询结果,不需要修改table_a的物理结构,可以使用相关子查询结合COALESCE处理无匹配的情况:
SELECT a.id, a.date, COALESCE( (SELECT SUM(b.value) FROM table_b b WHERE b.id = a.id AND b.date >= a.date - 90 DAYS AND b.date <= a.date), 0 ) AS new_column FROM table_a a;
逻辑说明:
- 对
table_a的每条记录,关联同ID的table_b数据,筛选出table_b.date在当前记录日期前90天到当天范围内的记录 - 用
COALESCE将无匹配时的NULL转为0,符合预期结果要求
2. 为table_a添加物理列并填充数据
如果需要永久在table_a中添加该列,可分两步操作:
步骤1:添加新列
ALTER TABLE table_a ADD COLUMN new_column INT DEFAULT 0;
步骤2:填充列数据
UPDATE table_a a SET new_column = COALESCE( (SELECT SUM(b.value) FROM table_b b WHERE b.id = a.id AND b.date >= a.date - 90 DAYS AND b.date <= a.date), 0 );
3. 自动维护新列(当table_b数据变化时自动更新)
如果希望new_column能随table_b的数据插入、更新、删除自动同步,需要创建触发器来实现(DB2的生成列不支持跨表引用):
-- 处理table_b插入操作的触发器 CREATE TRIGGER trg_table_b_insert AFTER INSERT ON table_b FOR EACH ROW UPDATE table_a a SET new_column = COALESCE( (SELECT SUM(b.value) FROM table_b b WHERE b.id = a.id AND b.date >= a.date - 90 DAYS AND b.date <= a.date), 0 ) WHERE a.id = NEW.id; -- 处理table_b更新操作的触发器 CREATE TRIGGER trg_table_b_update AFTER UPDATE ON table_b FOR EACH ROW UPDATE table_a a SET new_column = COALESCE( (SELECT SUM(b.value) FROM table_b b WHERE b.id = a.id AND b.date >= a.date - 90 DAYS AND b.date <= a.date), 0 ) WHERE a.id = COALESCE(NEW.id, OLD.id); -- 处理table_b删除操作的触发器 CREATE TRIGGER trg_table_b_delete AFTER DELETE ON table_b FOR EACH ROW UPDATE table_a a SET new_column = COALESCE( (SELECT SUM(b.value) FROM table_b b WHERE b.id = a.id AND b.date >= a.date - 90 DAYS AND b.date <= a.date), 0 ) WHERE a.id = OLD.id;
内容的提问来源于stack exchange,提问作者SRJCoding
相关产品推荐
相关产品推荐

