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

如何在同一查询中使用同表不同日期生成年度数据对比报表?

当然可以!完全可以把两个不同日期范围的查询合并成一次运行,只需要设置一次基准日期就行。下面给你两种适配不同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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:15:34