SQL-запрос BigQuery и Google Analytics
Я пытаюсь создать матрицу из таблицы, импортированной из данных Google Analytics в BigQuery. В таблице представлены обращения на веб-сайте, которые содержат идентификаторы session_ID вместе с некоторыми свойствами, такими как URL-адрес, временная метка и т. Д. Кроме того, существуют некоторые метаданные, основанные на определенных пользователем действиях, которые мы называем событиями. Ниже приведен пример таблицы.
session_id hit_timestamp url event_category
1 11:12:23 url134 event1
1 11:14:23 url2234 event2
1 11:16:23 url_target null
2 03:12:11 url2344 event1
2 03:14:11 url43245 event2
3 09:10:11 url5533 event2
3 09:09:11 url_target null
4 08:08:08 url64356 event2
4 08:09:08 url56456 event2
4 08:10:08 url_target null
Предполагаемый результат должен быть примерно таким, как в таблице ниже.
session_id event1 event2 target
1 1 1 1
2 0 0 0
3 0 0 0
4 0 2 1
Обратите внимание, что любое событие, не ведущее к url_target, следует обозначать нулями, включая цель. Это означает, что запрос должен проверять метку времени, чтобы убедиться, что за любыми событиями следует url_target, просмотрев их метку времени. Например, за событием 2 не было "url_target", поэтому мы обозначаем его как нули. Тот же случай в session_id 3, поскольку за событием 2 не следует url_target, обратите внимание на метку времени url_target, которая была до события 2, а не после него. Отсюда обозначается нулями.
Буду признателен за любую помощь в построении SQL-запроса для создания этой матрицы. Мне удалось сгруппировать только по session_id, а затем выполнить подсчет событий с помощью «count», но не смог найти SQL-запрос записи, который соответствовал бы метке времени и проверить другие поля.
Ответы
Используйте подзапрос для вычисления первого (или последнего) целевого времени. Затем используйте countif()и агрегацию:
select session_id,
countif(target_hit_timestamp > hit_timestamp and category = 'event1') as event1,
countif(target_hit_timestamp > hit_timestamp and category = 'event2') as event2,
countif(url like '%target') as target
from (select t.*,
min(case when url like '%target' then hit_timestamp end) over (partition by session_id) as target_hit_timestamp
from t
) t
group by session_id
Рассматривать:
select session_id,
countif(cnt_url_target > 0 and event_category = 'event1') event1,
countif(cnt_url_target > 0 and event_category = 'event2') event2,
countif(url = 'url_target') target
from (
select t.*,
countif(url = 'url_target') over(partition by session_id order by hit_timestamp desc) cnt_url_target
from mytable t
) t
group by session_id