Google Big Query SQL-агрегированные данные на основе сеансов - PullRequest
0 голосов
/ 26 ноября 2018

В настоящее время я работаю с данными Google Analytics в «Большом запросе», и мне еще только предстоит уяснить, как написать запрос для получения агрегированных данных по событиям из одного сеанса.Я искал вокруг, чтобы найти что-то, что могло бы работать, но не смог получить это до сих пор.По сути, так выглядит таблица (значительно упрощенная):

UserID | event_name | event_timestamp
--------------------------------------
1      | login      | 1543171146125000
1      | other event| 1543171155329000
1      | other event| 1543171155341001
1      | login      | 1543171157796003
1      | other event| 1543171160541000
2      | login      | 1543171157796003
2      | other event| 1543171177531000

Теперь я хочу агрегировать данные по сеансу пользователя AND, тогда как сеанс определяется как все события, пока не отобразится другое событие входа в систему.для этого пользователя.Я предполагаю, что мне нужно придумать дополнительное поле "сеанс", которое в основном всегда показывает новый идентификатор, когда встречается логин event_name для текущего агрегированного идентификатора пользователя.

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

UserID | session | EventCount
---------------------------
   1   |    1    |    3
   1   |    2    |    2
   2   |    1    |    2

Я предполагаю, что есть некоторыеподзапрос, который я мог бы использовать, чтобы получить это волшебное «сессионное» поле, что-то вроде:

SELECT UserID, session, COUNT(event_name) as EventCount
FROM (Insert Magical Subquery here)
GROUP BY UserID, session

Есть идеи, как это можно сделать?Это кажется простой вещью, но я просто не могу понять это.

1 Ответ

0 голосов
/ 26 ноября 2018

Судя по вашему примеру, сессия начинается с «логина».Таким образом, вы можете просто сделать кумулятивный подсчет «логинов» для каждого userid:

select t.*,
       countif(event_name = 'login') over (partition by userid order by event_timestamp) as session
from t;

Затем вы можете агрегировать:

select userid, session, count(*)
from (select t.*,
             countif(event_name = 'login') over (partition by userid order by event_timestamp) as session
      from t
     ) t
group by userid, session;
...