使用规则计算在会话中花费的时间

时间:2018-09-16 20:19:19

标签: sql amazon-redshift

比方说,基本表包含有关客户在其应用会话期间执行的每个操作(每行)的信息。当每个会话开始时,将记录action ='Show',而当用户结束会话时,将记录action ='Hide'。对于用户执行的任何其他操作,将以不同的操作名称记录在“显示”和“隐藏”之间。不幸的是,没有sessionID列,这是我试图根据这些信息创建的。

请假定仅在会话开始和会话结束时发出“显示”和“隐藏”这两个动作。

利用给定的信息,我想通过为每个会话(可以是数字或字符串)创建唯一的sessionID来汇总数据,并记录在该会话中花费的时间。

我正在使用Redshift SQL,因此如果我可以使用Redshift中的任何特殊功能,请加以利用。

base table and desired output

1 个答案:

答案 0 :(得分:1)

您可以尝试编写两个子查询并通过customer来创建行号

一个用于action = 'show',另一个用于action = 'Hide'

然后按行号join表示时间的开始和结束。

SELECT t1.customer,
       t2.rn,  
       DATEDIFF(mins, t1.time,t2.time) spentTime
FROM (
        SELECT *,
          ROW_NUMBER() OVER(PARTITION BY customer ORDER BY time) rn 
    FROM bastTable 
    WHERE action = 'show'
) t1 JOIN (
    SELECT *,
           ROW_NUMBER() OVER(PARTITION BY customer ORDER BY time) rn  
    FROM bastTable 
    WHERE action = 'Hide'
) t2 on t1.rn = t2.rn and t1.customer = t2.customer