求助:在BigQuery中获取当前日期、去年及上月同日的支付数据
解决方案:BigQuery中获取当日、去年同日及上月同日支付值
针对你的需求,我们可以利用BigQuery的日期函数生成目标对比日期,再通过自关联的方式获取对应日期的支付值。以下是可行的SQL代码:
SELECT curr.date AS 日期, curr.value AS 当前日期支付值, last_year.value AS 去年同日支付值, last_month.value AS 上月同日支付值 FROM `f_table.agg` curr LEFT JOIN `f_table.agg` last_year ON last_year.date = DATE_SUB(curr.date, INTERVAL 1 YEAR) LEFT JOIN `f_table.agg` last_month ON last_month.date = DATE_SUB(curr.date, INTERVAL 1 MONTH) ORDER BY curr.date DESC;
代码说明:
日期计算:
DATE_SUB(curr.date, INTERVAL 1 YEAR):直接计算当前日期的去年同日,BigQuery会自动处理闰年(比如2024-02-29的去年同日会是2023-02-28)。DATE_SUB(curr.date, INTERVAL 1 MONTH):计算当前日期的上月同日,若上月没有对应日期(比如3月31日的上月是2月,没有31日),会自动调整为上月最后一天(2024-03-31的上月同日是2024-02-29)。
自关联逻辑:
- 通过两次
LEFT JOIN分别关联去年同日和上月同日的记录,确保即使某日期没有对应对比数据时,结果仍会保留当前日期的行,对应字段显示为NULL。
- 通过两次
你之前代码的问题分析:
- 第一个
LEFT JOIN代码:仅处理了去年同日的关联,未覆盖上月同日的需求;且手动提取年月日进行匹配的方式不够简洁,还可能遗漏闰年、月末日期的特殊情况。 - 第二个
LAG函数代码:LAG(1)只能获取前一行的数据,无法直接定位到去年或上月的同日(因为日期可能不连续,跨年跨月的行号差远大于1),不符合需求。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

