比方说,基本表包含有关客户在其应用会话期间执行的每个操作(每行)的信息。当每个会话开始时,将记录action ='Show',而当用户结束会话时,将记录action ='Hide'。对于用户执行的任何其他操作,将以不同的操作名称记录在“显示”和“隐藏”之间。不幸的是,没有sessionID列,这是我试图根据这些信息创建的。
请假定仅在会话开始和会话结束时发出“显示”和“隐藏”这两个动作。
利用给定的信息,我想通过为每个会话(可以是数字或字符串)创建唯一的sessionID来汇总数据,并记录在该会话中花费的时间。
我正在使用Redshift SQL,因此如果我可以使用Redshift中的任何特殊功能,请加以利用。
答案 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