在sql

时间:2016-08-24 14:14:28

标签: sql netezza

我正在尝试查看会话长度,以查看用户连续几分钟登录的时间。问题是会话按活动分为几行。如果活动结束与下一行活动开始相同,则它们是同一会话的一部分,应该一起计算。

理想情况下,它看起来像这样,我有ACTIVITY_START和ACTIVITY_END,并希望创建SESSION:

ACTVITY_START   | ACTIVITY_END    | SESSION
----------------|-----------------|----------
2/16/2016 19:00 | 2/16/2016 20:51 | 1
2/16/2016 20:51 | 2/16/2016 20:52 | 1
2/16/2016 20:52 | 2/16/2016 20:54 | 1
2/16/2016 20:54 | 2/16/2016 21:25 | 1
2/16/2016 21:25 | 2/16/2016 21:26 | 1
2/16/2016 21:26 | 2/16/2016 22:13 | 1
2/16/2016 22:13 | 2/16/2016 22:14 | 1
2/16/2016 22:14 | 2/16/2016 22:41 | 1
2/18/2016 21:59 | 2/18/2016 23:07 | 2
2/18/2016 23:07 | 2/19/2016 0:00  | 2
2/19/2016 0:00  | 2/19/2016 1:56  | 2
2/19/2016 1:56  | 2/19/2016 1:58  | 2
2/19/2016 19:08 | 2/19/2016 20:53 | 3
2/19/2016 20:53 | 2/20/2016 0:00  | 3
2/20/2016 0:00  | 2/20/2016 0:05  | 3
2/20/2016 0:05  | 2/20/2016 2:00  | 3
2/20/2016 2:00  | 2/20/2016 2:12  | 3
2/20/2016 2:12  | 2/20/2016 2:28  | 3
2/20/2016 2:28  | 2/20/2016 2:32  | 3
2/20/2016 12:38 | 2/20/2016 14:16 | 4
2/20/2016 14:26 | 2/20/2016 14:27 | 5

最初我所做的是将活动结束与同一行中的下一个活动开始排成一行并做了:

SELECT DENSE_RANK() OVER (ORDER BY CASE WHEN A.ACTIVITY_END = B.ACTIVITY_START THEN 0 ELSE 1 END)

但是,当会话发生变化时,所有会话都会与所有会话分开。

我如何获得它,以便每次新会话开始时SESSION会递增?

1 个答案:

答案 0 :(得分:1)

即使您将问题标记为使用MySQL数据库,使用dense_rank()窗口函数执行“成功”查询的事实告诉我,它绝对不是MySQL。 MySQL目前不支持窗口函数。

仍然,基于以下事实:无论您的数据库是什么,它都支持Windows功能,我将继续并假设它包括对lagsum窗口函数的支持。如果是这种情况,您可以使用lag函数来标识哪些行不是前一行的延续。然后,您可以使用累积和来根据lag函数生成的值生成会话ID:

with cte as (
  select a.*,
         case when a.activity_start = lag(a.activity_end) over (order by a.activity_start)
              then 0 else 1 end as grp_id
    from activity a
)
select activity_start,
       activity_end,
       sum(grp_id) over (order by activity_start) as session_id
  from cte
   order by activity_start
相关问题