Как получить накопительную запись за день в BigQuery - PullRequest
2 голосов
/ 01 февраля 2020

У меня есть данные, как показано ниже.

|-----------|-------------|---------------|
|order_date | customer_id | product_id    |
|-----------|-------------|---------------|
|2020-01-01 | 123456      | 0001          |
|-----------|-------------|---------------|
|2020-01-02 | 123456      | 0005          |
|-----------|-------------|---------------|
|2020-01-03 |123456       | 0010          |
|-----------|-------------|---------------|

Тогда я хочу подсчитать кумулятивно product_id в день, как это.

|-----------|-------------|----------------------------|
|order_date |customer_id  |count_cumulative_product_id |
|-----------|-------------|----------------------------|
|2020-01-01 |123456       |1                           |
|-----------|-------------|----------------------------|
|2020-01-02 |123456       |2                           |
|-----------|-------------|----------------------------|
|2020-01-03 |123456       |3                           |         
|-----------|-------------|----------------------------|

Я понятия не имею, какой запрос решит это ...

Ответы [ 2 ]

0 голосов
/ 02 февраля 2020

Если вас не волнует кумулятивное число distinct product_ids, вы можете просто использовать подход с «движущимся окном»:

select 
   order_date,
   customer_id,
   count(product_id) over (order by product_id range between unbounded preceding and current row) as cumulative_product_ids
from `dataset.table`

Однако, , если , вы хотите кумулятивный количество различных product_ids, тогда вы можете использовать что-то вроде:

select order_date, customer_id, count(distinct x) as cumulative_product_ids from ( 
   select 
      order_date, 
      customer_id, 
      array_agg(product_id) over (order by product_id range between unbounded preceding and current row) as cumulative_product_ids
from `dataset.table`
), unnest(cumulative_product_ids) as x
group by 1,2

Надеюсь, это поможет.

0 голосов
/ 01 февраля 2020

Ниже для BigQuery Standard SQL

#standardSQL
SELECT *, 
  COUNT(1) OVER(PARTITION BY customer_id ORDER BY order_date) count_cumulative_product_id
FROM `project.dataset.table`

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

#standardSQL
WITH `project.dataset.table` AS (
  SELECT '2020-01-01' order_date, 123456 customer_id, '0001' product_id UNION ALL
  SELECT '2020-01-02', 123456, '0005' UNION ALL
  SELECT '2020-01-03', 123456, '0010' 
)
SELECT *, 
  COUNT(1) OVER(PARTITION BY customer_id ORDER BY order_date) count_cumulative_product_id
FROM `project.dataset.table`
-- ORDER BY order_date   

с результатом

Row order_date  customer_id product_id  count_cumulative_product_id  
1   2020-01-01  123456      0001        1    
2   2020-01-02  123456      0005        2    
3   2020-01-03  123456      0010        3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...