首页 > 解决方案 > 使用规则计算会话中花费的时间

问题描述

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

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

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

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

基表和所需的输出

标签: sqlamazon-redshift

解决方案


您可以尝试编写两个子查询并通过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

推荐阅读