You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 14:35:21