Bigquery - Оконная функция - Сумма за последние 3 месяца - PullRequest
0 голосов
/ 16 апреля 2020

Я рассчитываю суммировать столбец за последние 3 месяца с помощью функции WINDOW.

Пример моей структуры данных выглядит следующим образом

Дата Customer_id Количество

01-01-2020 A 100,0

01-02-2020 A 100,0

01-03-2020 A 100,0

01-04-2020 A 100,0 ....

Мой текущий подход заключается в создании функции WINDOW следующим образом:

WINDOW
90d_rolling AS (PARTITION BY customer_id ORDER BY date ROWS BETWEEN 89 PRECEDING AND CURRENT ROW)

Это прокси 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

(но мне просто любопытно, есть ли другой способ)

1 Ответ

1 голос
/ 16 апреля 2020

Ниже для BigQuery Standard 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`

Примечание: пример данных в вашем вопросе и комментариях - я предполагаю, что все даты - первый день месяца!

Вы можете протестировать, поиграть с вышеупомянутыми, используя пример / фиктивные данные, как в примере ниже

#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`   

с выводом

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  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...