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

如何用SQL借助参考表补全数据表中的缺失行?

SQL补全缺失记录并计算预算平均值解决方案

核心思路

先通过CROSS JOIN生成所有需要的Name-日期组合(确保每个Name都有2023-01-01至2023-01-03的记录),再关联原始数据表获取已有预算,最后用参考表的对应日期预算填充缺失值,得到完整记录集后计算平均值。

假设表结构

  • 原始数据表:budget_data,字段:Name(字符型)、date(日期型)、budget(数值型)
  • 参考表:reference_budget,字段:date(日期型)、budget(数值型)(包含2023-01-01至2023-01-03的预算数据)

完整SQL语句

-- 生成完整的Name-日期组合,补全缺失记录并填充预算
WITH full_date_name AS (
    -- 获取所有唯一的Name
    SELECT DISTINCT Name FROM budget_data
    -- 交叉连接目标日期范围(也可直接从参考表取日期)
    CROSS JOIN (
        SELECT date FROM reference_budget 
        WHERE date BETWEEN '2023-01-01' AND '2023-01-03'
    ) AS required_dates
)
SELECT 
    f.Name,
    f.date,
    -- 优先用原始数据预算,缺失则取参考表对应日期预算
    COALESCE(b.budget, r.budget) AS budget
FROM full_date_name f
LEFT JOIN budget_data b 
    ON f.Name = b.Name AND f.date = b.date
LEFT JOIN reference_budget r 
    ON f.date = r.date;

平均值计算扩展

如果需要直接算出每个Name的3天预算平均值,可在上述基础上修改为:

WITH full_date_name AS (
    SELECT DISTINCT Name FROM budget_data
    CROSS JOIN (
        SELECT date FROM reference_budget 
        WHERE date BETWEEN '2023-01-01' AND '2023-01-03'
    ) AS required_dates
)
SELECT 
    f.Name,
    AVG(COALESCE(b.budget, r.budget)) AS avg_3day_budget
FROM full_date_name f
LEFT JOIN budget_data b 
    ON f.Name = b.Name AND f.date = b.date
LEFT JOIN reference_budget r 
    ON f.date = r.date
GROUP BY f.Name;

关键部分说明

  • full_date_name 临时表:通过DISTINCT Name提取所有用户,再和目标日期做交叉连接,直接生成无缺失的用户-日期框架,解决原始数据缺行问题。
  • COALESCE 函数:按优先级取值,原始表有数据则用原始值,没有则用参考表的对应日期预算,完成缺失值补全。

内容的提问来源于stack exchange,提问作者lollicoco

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 16:26:27