如何在同一查询中使用同表不同日期生成年度数据对比报表?
当然可以!完全可以把两个不同日期范围的查询合并成一次运行,只需要设置一次基准日期就行。下面给你两种适配不同BigQuery SQL版本的解决方案:
方案1:适配Legacy SQL(你的原始查询用的就是这个)
核心思路是用UNION ALL合并两个时间段的查询结果,同时新增一个标识字段区分本年度/上年度数据,并且把日期参数集中管理,只需要改一次:
-- 只需要修改这里的两个日期,上年度会自动计算 SET @current_start = '2018-02-26'; SET @current_end = '2018-03-04'; -- 本年度数据 SELECT '本年度' AS 数据周期, TransactionDate, Source, Medium, Campaign, AdContent, Keyword, Country, Device, Region, ROUND(SUM(Revenue),2) AS Equity_Revenue, ROUND(SUM(Sales),2) AS Equity_Sales FROM (TABLE_DATE_RANGE([analytics.order_attribution_], TIMESTAMP(@current_start), TIMESTAMP(@current_end))) WHERE ReportType = 'Daily Equity Report' AND Channel = 'Email' GROUP BY TransactionDate, Source, Medium, Campaign, AdContent, Keyword, Country, Device, Region UNION ALL -- 上年度对应时间段数据 SELECT '上年度' AS 数据周期, TransactionDate, Source, Medium, Campaign, AdContent, Keyword, Country, Device, Region, ROUND(SUM(Revenue),2) AS Equity_Revenue, ROUND(SUM(Sales),2) AS Equity_Sales FROM (TABLE_DATE_RANGE([analytics.order_attribution_], TIMESTAMP(DATE_ADD(DATE(@current_start), -1, 'YEAR')), TIMESTAMP(DATE_ADD(DATE(@current_end), -1, 'YEAR')))) WHERE ReportType = 'Daily Equity Report' AND Channel = 'Email' GROUP BY TransactionDate, Source, Medium, Campaign, AdContent, Keyword, Country, Device, Region ORDER BY 数据周期, Equity_Revenue DESC;
方案2:适配Standard SQL(推荐,BigQuery现在默认用这个)
如果你的项目已经切换到Standard SQL,可以用_TABLE_SUFFIX来更高效地筛选分区表,写法更简洁:
WITH 日期参数 AS ( SELECT DATE('2018-02-26') AS 当前周期开始, DATE('2018-03-04') AS 当前周期结束 ) SELECT CASE WHEN PARSE_DATE('%Y%m%d', _TABLE_SUFFIX) BETWEEN 当前周期开始 AND 当前周期结束 THEN '本年度' ELSE '上年度' END AS 数据周期, TransactionDate, Source, Medium, Campaign, AdContent, Keyword, Country, Device, Region, ROUND(SUM(Revenue),2) AS Equity_Revenue, ROUND(SUM(Sales),2) AS Equity_Sales FROM `analytics.order_attribution_*`, 日期参数 WHERE (PARSE_DATE('%Y%m%d', _TABLE_SUFFIX) BETWEEN 当前周期开始 AND 当前周期结束 OR PARSE_DATE('%Y%m%d', _TABLE_SUFFIX) BETWEEN DATE_SUB(当前周期开始, INTERVAL 1 YEAR) AND DATE_SUB(当前周期结束, INTERVAL 1 YEAR)) AND ReportType = 'Daily Equity Report' AND Channel = 'Email' GROUP BY 数据周期, TransactionDate, Source, Medium, Campaign, AdContent, Keyword, Country, Device, Region ORDER BY 数据周期, Equity_Revenue DESC;
关键说明
- 新增的「数据周期」字段能让你在报表里直接区分两组数据,不用额外手动标记
- 两种方案都只需要修改开头的两个日期参数,上年度的对应时间段会自动计算,避免手动输入出错
- 确保两个子查询的字段数量、顺序、类型完全一致,
UNION ALL才能正确合并结果
内容的提问来源于stack exchange,提问作者DthR
相关产品推荐
相关产品推荐

