Snowflake SQL多连接错误求助:关联上年数据补全出勤值
Snowflake SQL 跨年度Attendance匹配解决方案
核心思路
要同时覆盖「当前日期有数据但上年无」「上年日期有数据但当前无」的场景,关键是先构建所有可能的日期-维度组合,再分别左连接当前和上年的Attendance数据,最后用COALESCE填充缺失值为0。
完整SQL代码
-- 1. 提取所有存在的Segment/Product组合,确保不遗漏任何维度值 WITH all_segment_product AS ( SELECT DISTINCT Segment, Product FROM 表A ), -- 2. 复用你的临时表C(日期-上年日期映射) date_py_mapping AS ( SELECT Date, Date_PY FROM C ), -- 3. 生成所有日期映射与维度组合的笛卡尔积,覆盖所有可能的情况 all_possible_combinations AS ( SELECT dpm.Date, dpm.Date_PY, asp.Segment, asp.Product FROM date_py_mapping dpm CROSS JOIN all_segment_product asp ) -- 4. 分别左连接当前和上年的Attendance数据,填充缺失值 SELECT apc.Date, apc.Date_PY, apc.Segment, apc.Product, COALESCE(a_curr.Attendance, 0) AS Attendance, COALESCE(a_past.Attendance, 0) AS Attendance_PY FROM all_possible_combinations apc LEFT JOIN 表A a_curr ON apc.Date = a_curr.Date AND apc.Segment = a_curr.Segment AND apc.Product = a_curr.Product LEFT JOIN 表A a_past ON apc.Date_PY = a_past.Date AND apc.Segment = a_past.Segment AND apc.Product = a_past.Product ORDER BY apc.Date, apc.Segment, apc.Product;
为什么之前的方法出问题
- LEFT JOIN失效:直接用临时表C左连接表A,只会保留C中日期在表A有匹配的行,无法覆盖「上年有数据但当前无」的场景——因为左表没有包含这些缺失的维度组合。
- FULL OUTER JOIN异常:空的Date_PY是因为表A中存在不在C映射范围内的日期;重复行则大概率是关联条件只加了日期,没关联Segment和Product,导致一对多匹配。
可选优化
如果表B的日期范围远大于表A实际用到的日期,可以在date_py_mapping中加过滤,减少不必要的组合:
date_py_mapping AS ( SELECT Date, Date_PY FROM C -- 只保留表A中存在的日期及其上年对应日期 WHERE Date IN (SELECT DISTINCT Date FROM 表A) OR Date_PY IN (SELECT DISTINCT Date FROM 表A) )
内容的提问来源于stack exchange,提问作者EnzoD
相关产品推荐
相关产品推荐

