Счетчик по группам и флаг в BigQuery? - PullRequest
2 голосов
/ 29 марта 2020

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

Row | Fullvisitorid | Visitid | New_Session_Flag 
1   | A             | 111     | 1
2   | A             | 120     | 0
3   | A             | 128     | 0
4   | A             | 133     | 0
5   | A             | 745     | 1
6   | A             | 777     | 0
7   | B             | 388     | 1
8   | B             | 401     | 0
9   | B             | 420     | 0
10  | B             | 777     | 1
11  | B             | 784     | 0
12  | B             | 791     | 0
13  | B             | 900     | 1  
14  | B             | 904     | 0  

Что я хочу сделать, если это первая строка для fullvisitorid, то пометьте поле как 1, в противном случае используйте вышеуказанную строку в качестве значение, но если new_session_flag = 1, то используйте вышеприведенную строку плюс 1, пример вывода, который я ищу ниже:

Row | Fullvisitorid | Visitid | New_Session_Flag | Rank_Session_Order
1   | A             | 111     | 1                | 1
2   | A             | 120     | 0                | 1
3   | A             | 128     | 0                | 1
4   | A             | 133     | 0                | 1
5   | A             | 745     | 1                | 2
6   | A             | 777     | 0                | 2
7   | B             | 388     | 1                | 1
8   | B             | 401     | 0                | 1
9   | B             | 420     | 0                | 1
10  | B             | 777     | 1                | 2
11  | B             | 784     | 0                | 2
12  | B             | 791     | 0                | 2
13  | B             | 900     | 1                | 3
14  | B             | 904     | 0                | 3

Как видите:

  • Строка 1 равна 1, потому что это первый раз, когда fullvisitorid A появляется

  • Строка 2 это 1, потому что это не первый раз, когда fullvisitorid A появляется и new_session_flag <> 1, поэтому он использует вышеуказанную строку (т.е. 1)

  • Строка 5 равна 2, потому что это не первый раз, когда fullvisitorid A появляется и new_session_Flag = 1, поэтому он использует вышеуказанную строку (т.е. 1) плюс 1

  • Строка 7 равна 1, потому что это первый раз, когда появляется fullvisitorid B

    et c.

Я считаю, что это можно сделать с помощью retain оператор в SAS, но есть ли эквивалент в Google BigQquery?

Ho пожалуй, вышеупомянутое имеет смысл, дайте мне знать, если нет.

Заранее спасибо

Ответы [ 2 ]

3 голосов
/ 29 марта 2020

Ниже для BigQuery Standard SQL

#standardSQL
SELECT *,
  COUNTIF(New_Session_Flag = 1) OVER(PARTITION BY Fullvisitorid  ORDER BY Visitid) Rank_Session_Order
FROM `project.dataset.table`
0 голосов
/ 29 марта 2020

Ответ Михаила Берлянта, использующий условное количество окон, корректен и работает. Я отвечаю, потому что нахожу, что сумма окон еще проще (и, возможно, более эффективна для большого набора данных):

select
    t.*,
    sum(new_session_flag) over(partition by fullvisitorid order by visid_id) rank_session_order
from mytable t

Это работает, потому что new_session_flag содержит 0 с и 1 с только; поэтому подсчет 1 s фактически эквивалентен суммированию всех значений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...