Bigquery - 窗口函数 - 过去 3 个月的总和

1 sql google-bigquery

我希望使用 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)

(但我只是好奇是否还有其他方法)

Mik*_*ant 5

以下是 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)