Изолировать / суммировать данные условно на основе последовательности событий - PullRequest
0 голосов
/ 22 июня 2019

У меня есть таблица, которая отслеживает события последовательно и рассчитывает время для каждого события. То, что я хочу сделать, используя приведенные ниже примеры данных, - это рассчитать общее количество прошедших по времени (секунд) всех событий A, которые произошли за до второго события C. Итак, в приведенном ниже примере, я хотел бы выводить 550 секунд.

Очевидно,

select sum(timeelapse_seconds) where eventtype = "A"

возвращает результат 750 секунд, поскольку он включает в себя событие № 6.

Event EventType TimeElapse_Seconds
----------------------------------    
  1        C          50
  1        A         100
  2        A         100
  3        B         200
  4        A         350
  5        C         100
  6        A         200

Спасибо!

Обновление

Извиняюсь, что только что понял что-то о моем наборе данных. Будет событие Event 1 с EventType C. Итак, мне нужно найти второй экземпляр, а не первый (так что min не работает). Я обновил образец таблицы.

Ответы [ 4 ]

2 голосов
/ 22 июня 2019

Ниже для BigQuery Standard SQL

#standardSQL
SELECT SUM(TimeElapse_Seconds) TotalElapse_Seconds
FROM (
  SELECT EventType, TimeElapse_Seconds, 
    COUNTIF(EventType = 'C') OVER(ORDER BY Event) = 1 BeforeC
  FROM `project.dataset.table`
)
WHERE EventType = 'A' AND BeforeC 

Если применить к образцу данных из вашего квеста - результат будет

Row TotalElapse_Seconds  
1   550  
1 голос
/ 22 июня 2019

Итак, сначала вы должны найти позицию Второго появления события C, а затем суммировать значение TimeElapse_Seconds для всех событий A с индексом, второстепенным для этой позиции. Итак:

SELECT SUM(TimeElapse_Seconds)
FROM events
WHERE EventType = 'A' 
AND Event < (SELECT MIN(Event) -- Second appearance of event C
             FROM events
             WHERE EventType = 'C' 
               AND Event > (SELECT MIN(Event) -- First appearance of event C
                            FROM events
                            WHERE EventType = 'C'))
0 голосов
/ 22 июня 2019

Предполагая, что Event определяет порядок определения того, что до означает ...

SELECT sum(TimeElapse_Seconds)
FROM events
WHERE EventType = 'A' AND Event < (SELECT min(Event) FROM events WHERE EventType = 'C');

- это один из способов.Для достижения наилучших результатов вам нужен индекс на (EventType, Event)

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

Один метод заключается в использовании оконных функций:

select sum(TimeElapse_Seconds)
from (select t.*,
             min(case when eventtype = 'C' then event end) over (order by event) as min_c_event
      from t
     ) t
where event < min_c_event and event = 'A';
...