如何用SQL补全缺失日期的ID并标记日活状态(Active/Inactive)
解决缺失记录补全及NOT IN查询失效问题
为什么NOT IN返回0行?
如果你的ID列存在NULL值,使用NOT IN会触发SQL的三值逻辑陷阱——任何值与NULL比较的结果都是UNKNOWN,而NOT IN会将UNKNOWN判定为FALSE,最终导致查询返回空结果。改用NOT EXISTS可以避开这个问题。
补全缺失记录的方法
要补全22/11/22日ID=999的记录(Volume设为0),可以通过NOT EXISTS判断该记录是否存在,不存在则执行插入:
-- 插入缺失的记录 INSERT INTO your_table (Date, ID, Volume) SELECT '22/11/22' AS Date, 999 AS ID, 0 AS Volume WHERE NOT EXISTS ( SELECT 1 FROM your_table WHERE Date = '22/11/22' AND ID = 999 );
新增Status字段标记日活状态
补全记录后,用CASE语句生成Status字段,规则可按需定义:
- 当日Volume>0时标记为
Active - 其余情况(包括补全的Volume=0记录)标记为
Inactive
查询示例:
SELECT Date, ID, Volume, CASE WHEN Volume > 0 THEN 'Active' ELSE 'Inactive' END AS Status FROM your_table;
如果不需要修改原表,只想一次性查询出包含补全记录的结果,可以用CTE生成目标日期-ID组合,再左连接原表:
WITH required_records AS ( -- 指定需要补全的日期和ID SELECT '22/11/22' AS Date, 999 AS ID -- 合并原表中当天的所有记录 UNION ALL SELECT Date, ID FROM your_table WHERE Date = '22/11/22' ) SELECT rr.Date, rr.ID, COALESCE(t.Volume, 0) AS Volume, CASE WHEN COALESCE(t.Volume, 0) > 0 THEN 'Active' ELSE 'Inactive' END AS Status FROM required_records rr LEFT JOIN your_table t ON rr.Date = t.Date AND rr.ID = t.ID GROUP BY rr.Date, rr.ID, t.Volume;
内容的提问来源于stack exchange,提问作者cheerful
相关产品推荐
相关产品推荐

