Как сгруппировать пользовательские сессии по преобразованной строке - PullRequest
0 голосов
/ 17 июня 2019

Я занимаюсь простым многоканальным исследованием атрибуции и застрял в группировке пользовательских сессий.

Например, у меня есть простая таблица сеансов:

client channel time converted
1   social  1   0
1   cpc     2   0
1   email   3   1
1   email   4   0
1   cpc     5   1
2   organic 1   0
2   cpc     2   1
3   email   1   0

Каждая строка содержит сеансы пользователя и преобразованный столбец , который показывает, преобразован ли пользователь в конкретном сеансе.

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

client channels time converted
1 [social,cpc,email] 3  1
1 [email,cpc]        5  1
2 [organic,cpc]      2  1
3 [email]            1  0

Обратите внимание, что пользователь 3 не преобразован, но мне нужны его сеансы

Ответы [ 2 ]

0 голосов
/ 17 июня 2019

Ниже для BigQuery Standard SQL

#standardSQL
SELECT 
  client, 
  STRING_AGG(channel ORDER BY time) channels,
  MAX(time) time,
  MAX(converted) converted 
FROM (
  SELECT *, COUNTIF(converted = 1) OVER(PARTITION BY client ORDER BY time DESC) session
  FROM `project.dataset.table` 
)
GROUP BY client, session 
-- ORDER BY client, time

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

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 1 client, 'social' channel, 1 time, 0 converted UNION ALL
  SELECT 1, 'cpc', 2, 0 UNION ALL
  SELECT 1, 'email', 3, 1 UNION ALL
  SELECT 1, 'email', 4, 0 UNION ALL
  SELECT 1, 'cpc', 5, 1 UNION ALL
  SELECT 2, 'organic', 1, 0 UNION ALL
  SELECT 2, 'cpc', 2, 1 UNION ALL
  SELECT 3, 'email', 1, 0 
)
SELECT 
  client, 
  STRING_AGG(channel ORDER BY time) channels,
  MAX(time) time,
  MAX(converted) converted 
FROM (
  SELECT *, COUNTIF(converted = 1) OVER(PARTITION BY client ORDER BY time DESC) session
  FROM `project.dataset.table` 
)
GROUP BY client, session 
ORDER BY client, time   

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

Row client  channels            time    converted    
1   1       social,cpc,email    3       1    
2   1       email,cpc           5       1    
3   2       organic,cpc         2       1    
4   3       email               1       0    
0 голосов
/ 17 июня 2019

Вам необходимо назначить группу. Для этой цели обратная сумма converted выглядит как правильная вещь:

select client, array_agg(channel order by time) as channels,
       max(time) as time, max(converted) as converted
from (select t.*,
             sum(t.converted) over (partition by t.client order by t.time desc) as grp
      from t
     ) t
group by client, grp;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...