У меня есть набор данных, который представляет аналитические события, такие как:
Row timestamp account_id type
1 2018-11-14 21:05:40 UTC abc start
2 2018-11-14 21:05:40 UTC xyz another_type
3 2018-11-26 22:01:19 UTC xyz start
4 2018-11-26 22:01:23 UTC abc start
5 2018-11-26 22:01:29 UTC xyz some_other_type
11 2018-11-26 22:13:58 UTC xyz start
...
С некоторым количеством account_ids.Мне нужно найти среднее время между start
записями на account_id
.
. Я пытаюсь использовать аналитические функции, как описано здесь .Моей конечной целью будет таблица типа:
Row account_id avg_time_between_events_mins
1 xyz 53
2 abc 47
3 pqr 65
...
моя лучшая попытка - на основе этого поста - выглядит следующим образом:
WITH
events AS (
SELECT
COUNTIF(type = 'start' AND account_id='abc') OVER (ORDER BY timestamp) as diff,
timestamp
FROM
`myproject.dataset.events`
WHERE
account_id='abc')
SELECT
min(timestamp) AS start_time,
max(timestamp) AS next_start_time,
ABS(timestamp_diff(min(timestamp), max(timestamp), MINUTE)) AS minutes_between
FROM
events
GROUP BY
diff
Это вычисляетвремя между каждым start
событием и последним не start
событием перед следующим start
событием для определенного account_id
.
Я пытался использовать PARTITION
и WINDOW FRAME CLAUSE
вот так:
WITH
events AS (
SELECT
COUNT(*) OVER (PARTITION BY account_id ORDER BY timestamp ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING) as diff,
timestamp
FROM
`myproject.dataset.events`
WHERE
type = 'start')
SELECT
min(timestamp) AS start_time,
max(timestamp) AS next_start_time,
ABS(timestamp_diff(min(timestamp), max(timestamp), MINUTE)) AS minutes_between
FROM
events
GROUP BY
diff
Но я получил бессмысленную таблицу результатов.Может кто-нибудь объяснить мне, как я мог бы написать и рассуждать о таком запросе?