BigQuery同比数据关联新增维度后总数不匹配,USING函数用法是否正确?
BigQuery同比查询数据不匹配问题排查
你所使用的USING关联语法本身符合BigQuery规范,关联字段匹配逻辑没有错误,数据不匹配是语法缺陷、关联逻辑不合理共同导致的,具体问题和修复方案如下:
1. 基础语法错误
你提供的查询存在CTE定义不完整、括号不匹配的问题,首先需要修正:
- 当期数据统计子查询未声明
CURRENT_PERIOD别名,无法被后续关联逻辑引用 - 多个子查询的闭合括号缺失,会直接导致查询运行失败
2. 核心问题:左连接逻辑丢失上年维度数据
你采用CURRENT_PERIOD LEFT OUTER JOIN PREV_YEAR的关联逻辑,只会保留2021年存在的browser、device维度组合对应的2020年数据:如果某类browser+device组合仅在2020年有访问量、2021年无对应数据,这部分2020年的访问量会完全被排除在最终结果外,你汇总全局同比数据时自然会出现上年总数据偏小、不匹配的问题。
修复方案:改用FULL OUTER JOIN保留两侧所有维度组合,同时用COALESCE补全空值:
WITH CURRENT_PERIOD AS ( SELECT date, py_date, browser, device, sum(ga_sessions) as visit FROM ( SELECT device.browser as browser, device.deviceCategory as device, PARSE_DATE("%Y%m%d", date) as date, DATE_SUB(PARSE_DATE("%Y%m%d", date), INTERVAL 364 DAY) as py_date, totals.visits as ga_sessions FROM `xx.ga_sessions_20210824` ) GROUP BY date, py_date, browser, device ), PREV_YEAR as ( SELECT py_date, browser, device, sum(py_ga_sessions) as py_visit FROM ( SELECT PARSE_DATE("%Y%m%d", date) as py_date, totals.visits as py_ga_sessions, device.browser as browser, device.deviceCategory as device FROM `xx.ga_sessions_20200824` ) GROUP BY py_date, browser, device ), DATAPULL as ( SELECT COALESCE(c.date, DATE_ADD(p.py_date, INTERVAL 364 DAY)) as date, COALESCE(c.py_date, p.py_date) as py_date, COALESCE(c.browser, p.browser) as browser, COALESCE(c.device, p.device) as device, COALESCE(c.visit, 0) as visit, COALESCE(p.py_visit, 0) as py_visit FROM CURRENT_PERIOD c FULL OUTER JOIN PREV_YEAR p USING(py_date, browser, device) ORDER BY date DESC ) SELECT * FROM DATAPULL
3. 可选优化:同比日期逻辑校验
你当前用INTERVAL 364 DAY做日期偏移是按周对齐的逻辑(保证两年日期为同一星期几),如果你的业务要求为自然日同比,建议改为DATE_SUB(date, INTERVAL 1 YEAR),避免闰年等特殊日期导致的匹配偏差。
内容的提问来源于stack exchange,提问作者chris_ff
相关产品推荐
相关产品推荐

