CASE语句基于滞后/超前行在BQ的分区中创建另一个窗口

时间:2019-03-09 22:37:45

标签: sql google-bigquery

我正在尝试执行一个sql查询,该查询将根据下一行是否在0.01秒后创建订单中的组。

对于一个我正在从事的项目,我有虚拟数据,而在不同应用程序中手机被ping一次。我们必须计算各种指标,如果手机几秒钟没有ping通,那应该是另一个群组。

enter image description here

quantstrat

我正在尝试向此查询添加另一个“分组”,以考虑到会话断开连接几毫秒时的情况,因此,即使最后两行位于同一session_id中,它也会断开连接一毫秒,因此应该是该会话中的2个唯一组。

我试图弄清楚如何做一个case语句,以便我可以根据以下公式在Session_id(针对给定的应用程序/用户)内创建另一个分组: 线索(time_pinged,1)-time_pinged!= .01

我最初的想法是创建开始/结束“窗口”,说: 如果:SELECT APP_ID, Session_id, Phone_id, Time_pinged, LAG(Time_pinged,1) OVER(PARTITION BY App_id, Session_id, Phone_id order by Time_pinged) as Lag_time, LEAD(Time_pinged,1) OVER(PARTITION BY App_id, Session_id, Phone_id order by Time_pinged) as Lead_time FROM Mydataset.app_data ->开始帧 和案例 time_pinged - lag(time_pinged,1) != .01->结束帧。现在,我认为我不需要这两种情况,因为如果我知道结束帧,我就会知道开始帧,但不确定。

非常感谢。

2 个答案:

答案 0 :(得分:1)

求和。也就是说,使用lag()定义组从何处开始,然后基于累积总和分配组号。

SELECT ad.*,
       COUNTIF( lag_time < time_pinged - 0.015 ) OVER (PARTITOIN BY App_id, Session_id, Phone_id) as grp 
FROM (SELECT ad.*
             LAG(Time_pinged, 1) OVER (PARTITION BY App_id, Session_id, Phone_id ORDER BY Time_pinged) as Lag_time,
      FROM Mydataset.app_data ad
     ) ad;

答案 1 :(得分:1)

以下是用于BigQuery标准SQL

#standardSQL
SELECT App_id, Session_id, Phone_id, Time_pinged, 
  COUNTIF(new_group) OVER(PARTITION BY App_id, Session_id, Phone_id ORDER BY Time_Pinged) sub_session
FROM (
  SELECT App_id, Session_id, Phone_id, Time_pinged, 
    CAST(Time_pinged - LAG(Time_pinged) OVER(PARTITION BY App_id, Session_id, Phone_id ORDER BY Time_Pinged) as NUMERIC) > 0.01 new_group
  FROM `project.dataset.table`
)

如果要对问题中的示例数据进行比较-结果为

Row App_id  Session_id  Phone_id    Time_pinged sub_session  
1   AppA    g12_ab      89002       0.01        0    
2   AppA    g12_ab      89002       0.02        0    
3   AppA    g12_ab      89002       0.03        0    
4   AppA    g12_ab      89002       0.04        0    
5   AppA    g12_ab      89002       0.08        1    
6   AppA    g12_ab      89002       0.09        1