Группировка строк на основе значений столбцов в SQL / BigQuery - PullRequest
0 голосов
/ 26 мая 2020

Можно ли «группировать» строки в BigQuery / SQL в зависимости от значений столбцов? Скажем, я хочу назначить строку / идентификатор для всех строк между stream_start_init и stream_start, а затем сделать то же самое для строк между stream_resume и последним stream_ad.

Количество событий stream_ad может отличаться, поэтому я не могу используйте RANK () или ROW (), чтобы сгруппировать их на основе этих значений.

|id, timestamp, event|
|1 |  1231231 | first_visit|
|2 |  1231232 | login|
|3 |  1231233 | page_view|
|4 |  1231234 | page_view| 
|5 |  1231235 | stream_start_init|
|6 |  1231236 | stream_ad|
|7 |  1231237 | stream_ad| 
|8 |  1231238 | stream_ad| 
|9 |  1231239 | stream_start|
|6 |  1231216 | stream_resume|
|6 |  1231236 | stream_ad|
|7 |  1231217 | stream_ad| 
|8 |  1231258 | stream_ad| 
|10|  1231240 | page_view|

Как сделать sh таблицу

|id, timestamp, event, group_id|
|1 |  1231231 | first_visit, null|
|2 |  1231232 | login, null|
|3 |  1231233 | page_view, null|
|4 |  1231234 | page_view, null| 
|5 |  1231235 | stream_start_init, group_1|
|6 |  1231236 | stream_ad, group_1|
|7 |  1231237 | stream_ad, group_1| 
|8 |  1231238 | stream_ad, group_1| 
|9 |  1231239 | stream_start, group_1|
|6 |  1231216 | stream_resume, group_2|
|6 |  1231236 | stream_ad, group_2|
|7 |  1231217 | stream_ad, group_2| 
|8 |  1231258 | stream_ad, group_2| 
|10|  1231240 | page_view, null|

Ответы [ 2 ]

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

Я бы не стал назначать строку. Я бы присвоил номер. Похоже, это совокупная сумма. Я думаю, что сумма количества "stream_start_init" и "stream_resume" делает то, что вы хотите:

select t.*,
       countif(event in ('stream_start_init', 'stream_resume')) over (order by timestamp) as group_id
from t;

Обратите внимание, что это дает 0 для первой группы - что кажется хорошим. Вы можете преобразовать это в NULL, используя NULLIF().

Если вам действительно нужны строки, вы можете использовать CONCAT().

0 голосов
/ 26 мая 2020

Ниже для BigQuery Standard SQL

#standardSQL
SELECT *,
  IF(event IN ('stream_start_init', 'stream_start', 'stream_resume', 'stream_ad'),
    COUNTIF(event IN ('stream_start_init', 'stream_resume')) OVER(ORDER BY timestamp),
    NULL
  ) AS group_id
FROM `project.dataset.table`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...