Текущий итог всех предыдущих строк BigQuery - PullRequest
2 голосов
/ 05 мая 2020

У меня есть таблица BigQuery, которая выглядит следующим образом:

ID  SessionNumber  CountOfAction   Category
 1       1              1            B
 1       2              3            A
 1       3              1            A
 1       4              4            B
 1       5              5            B

Я пытаюсь получить промежуточную сумму всех предыдущих строк для CountofAction, где category = A. Окончательный результат должен быть

 ID  SessionNumber  CountOfAction
 1       1              0   --no previous rows have countofAction for category = A
 1       2              0   --no previous rows have countofAction for category = A
 1       3              3   --previous row (Row 2) has countofAction = 3 for category = A
 1       4              4   --previous rows (Row 2 and 3) have countofAction = 3 and 1 for category = A
 1       5              4   --previous rows (Row 2 and 3) have countofAction = 3 and 1 for category = A

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

 select 
 ID,
 SessionNumber ,
 SUM(CountofAction)  OVER(Partition by clieIDntid ORDER BY SessionNumber ROWS BETWEEN UNBOUNDED 
 PRECEDING AND 1 PRECEDING)as CumulativeCountofAction
 From TAble1 where category = 'A'

Я был бы очень признателен за любую помощь по этому поводу! Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 05 мая 2020

Фильтрация category в предложении where удаляет (id, sessionNumber) кортежи, в которых category 'A 'не отображается, что вам не нужно.

Вместо этого вы можете использовать агрегирование и условный sum():

select
    id,
    sessionNumber,
    sum(sum(if(category = 'A', countOfAction, 0))) over(
        partition by id 
        order by sessionNumber
        rows between unbounded preceding and 1 preceding
    ) CumulativeCountofAction
from mytable t
group by id, sessionNumber
order by id, sessionNumber
1 голос
/ 05 мая 2020

Ниже приведено для BigQuery Standard SQL

#standardSQL
SELECT ID, SessionNumber,   
  IFNULL(SUM(IF(category = 'A', CountOfAction, 0)) OVER(win), 0) AS CountOfAction
FROM `project.dataset.table` 
WINDOW win AS (ORDER BY SessionNumber ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING)

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

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 1 ID, 1 SessionNumber, 1 CountOfAction, 'B' Category UNION ALL
  SELECT 1, 2, 3, 'A' UNION ALL
  SELECT 1, 3, 1, 'A' UNION ALL
  SELECT 1, 4, 4, 'B' UNION ALL
  SELECT 1, 5, 5, 'B' 
)
SELECT ID, SessionNumber,   
  IFNULL(SUM(IF(category = 'A', CountOfAction, 0)) OVER(win), 0) AS CountOfAction
FROM `project.dataset.table` 
WINDOW win AS (ORDER BY SessionNumber ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING)   

результат:

Row ID  SessionNumber   CountOfAction    
1   1   1               0    
2   1   2               0    
3   1   3               3    
4   1   4               4    
5   1   5               4    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...