Как использовать аналитические функции BigQuery для вычисления времени между строками с метками времени? - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть набор данных, который представляет аналитические события, такие как:

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

Но я получил бессмысленную таблицу результатов.Может кто-нибудь объяснить мне, как я мог бы написать и рассуждать о таком запросе?

1 Ответ

2 голосов
/ 18 апреля 2019

Для этого вам не нужны аналитические функции:

select timestamp_diff(min(timestamp), max(timestamp), MINUTE)) / nullif(count(*) - 1, 0)
from `myproject.dataset.events`
where type = 'start'
group by account_id;

Это метка времени самого последнего минус самое старое, деленное на единицу меньше числа пусков.Это среднее между стартами.

...