我希望使用 WINDOW 函数对过去 3 个月的一列进行求和。
我的数据结构的示例如下
日期 Customer_id 金额
2020年1月1日 100.0
2020年1月2日 100.0
2020年1月3日 100.0
2020年1月4日 100.0 ....
我当前的方法是创建一个 WINDOW 函数,如下所示:
WINDOW
90d_rolling AS (PARTITION BY customer_id ORDER BY date ROWS BETWEEN 89 PRECEDING AND CURRENT ROW)
Run Code Online (Sandbox Code Playgroud)
这将 3 个月表示为 90 天 - 但我想知道是否可以使用窗口函数对过去 3 个月进行求和,即 01-04-2020 的日期 -> 求和到 01-01-2020。
请注意,我知道这样做的一种方法是通过
left join to itself where a.date >= date_sub(b.date, interval 3 month) and a.date <= b.date
Run Code Online (Sandbox Code Playgroud)
(但我只是好奇是否还有其他方法)
以下是 BigQuery 标准 SQL
#standardSQL
SELECT *,
SUM(amount) OVER(
PARTITION BY customer_id
ORDER BY DATE_DIFF(`date`, '2000-01-01', MONTH)
RANGE BETWEEN 3 PRECEDING AND 1 PRECEDING
) AS rolling_3m_ammount
FROM `project.dataset.table`
Run Code Online (Sandbox Code Playgroud)
注意:基于您的问题和评论中的示例数据 - 我假设所有日期都是每月的第一天!
您可以使用示例/虚拟数据来测试、玩上面的内容,如下例所示
#standardSQL
WITH `project.dataset.table` AS (
SELECT DATE '2020-01-01' `date`, 'A' customer_id, 1.0 amount UNION ALL
SELECT '2020-02-01', 'A', 2.0 UNION ALL
SELECT '2020-03-01', 'A', 3.0 UNION ALL
SELECT '2020-04-01', 'A', 4.0 UNION ALL
SELECT '2020-05-01', 'A', 5.0 UNION ALL
SELECT '2020-07-01', 'A', 6.0 UNION ALL
SELECT '2020-09-01', 'A', 7.0
)
SELECT *,
SUM(amount) OVER(
PARTITION BY customer_id
ORDER BY DATE_DIFF(`date`, '2000-01-01', MONTH)
RANGE BETWEEN 3 PRECEDING AND 1 PRECEDING
) AS rolling_3m_ammount
FROM `project.dataset.table`
-- ORDER BY `date`
Run Code Online (Sandbox Code Playgroud)
带输出
Row date customer_id amount rolling_3m_ammount
1 2020-01-01 A 1.0 null
2 2020-02-01 A 2.0 1.0
3 2020-03-01 A 3.0 3.0
4 2020-04-01 A 4.0 6.0
5 2020-05-01 A 5.0 9.0
6 2020-07-01 A 6.0 9.0
7 2020-09-01 A 7.0 6.0
Run Code Online (Sandbox Code Playgroud)