我正在尝试执行一个sql查询,该查询将根据下一行是否在0.01秒后创建订单中的组。
对于一个我正在从事的项目,我有虚拟数据,而在不同应用程序中手机被ping一次。我们必须计算各种指标,如果手机几秒钟没有ping通,那应该是另一个群组。
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
->结束帧。现在,我认为我不需要这两种情况,因为如果我知道结束帧,我就会知道开始帧,但不确定。
非常感谢。
答案 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