根据事件序列有条件地隔离/求和数据

时间:2019-06-21 21:57:09

标签: sql google-bigquery standard-sql

我有一个表,该表顺序跟踪事件并计算每个事件的时间。我要使用以下示例数据来做的是计算在第二个事件C发生之前 发生的所有事件A的经过时间(秒)的总数。因此,在下面的示例中,我希望输出550秒。

很明显,

select sum(timeelapse_seconds) where eventtype = "A"

由于包含事件#6,因此返回750秒的结果。

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

谢谢!

更新

道歉,因为我刚刚意识到自己的数据集。将会有一个带有EventType C的初始事件1。因此,我需要找到第二个实例而不是第一个实例(因此min不起作用)。我已经更新了示例表。

4 个答案:

答案 0 :(得分:2)

以下是用于BigQuery标准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 :(得分:1)

好吧,首先,您必须找到事件C的第二次出现的位置,然后将索引为次要位置的所有A事件的TimeElapse_Seconds值相加。所以:

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'))

答案 2 :(得分:0)

一种方法是使用窗口函数:

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';

答案 3 :(得分:0)

假设Event确定用于确定之前含义的顺序...

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

是一种方法。为了获得最佳结果,您需要在(EventType, Event)

上建立索引