根据SQL / BigQuery中的列值对行进行分组

时间:2020-05-26 08:56:49

标签: sql google-bigquery

是否可以根据列值对BigQuery / SQL中的行进行“分组”?假设我要为stream_start_init和stream_start之间的所有行分配一个字符串/ id,然后对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|

我希望桌子如何

|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 个答案:

答案 0 :(得分:2)

我不会分配字符串。我会分配一个数字。这似乎是一个累加的总和。我认为“ 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()

答案 1 :(得分:0)

以下是BigQuery标准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`