2016-08-24 5 views
1

세션 길이를보고 사용자가 몇 분 동안 로그인 한 시간을 확인하려고합니다. 문제는 세션이 활동별로 행으로 분리된다는 것입니다. 활동 종료가 다음 행 활동 시작과 동일하면 동일한 세션의 일부이므로 함께 계산해야합니다. 이상적으로SQL에서 여러 행에 걸쳐 연속 세션 그룹화

는 같을 것이다, 내가 ACTIVITY_START 및 ACTIVITY_END 가지고 세션을 생성하고 싶습니다 : 나는이었다 한 원래 무엇을

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

MySQL 데이터베이스를 사용하여 질문에 태그를 지정했는데 dense_rank() 창 기능을 사용하여 "성공적인"쿼리를 수행했다는 사실은 분명히 MySQL이 아님을 나타냅니다. MySQL은 현재 윈도우 함수를 지원하지 않습니다.

귀하의 데이터베이스가 무엇이든, 그것이 윈도우 기능을 지원한다는 사실에 기반하여, 나는 윈도우 기능이 및 sum에 대한 지원을 포함한다고 가정합니다. 이 경우 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 
+0

그것은 유감하는 Netezza의 데이터베이스입니다. 내가 무엇을했는지 잊어 버렸습니다. – user6745154

+0

문서에 따르면 Netezza는 '지연'및 '합계'창 기능을 모두 지원합니다. 그래서 내 대답은 잘 작동합니다. 최악의 경우, 사소한 구문 수정을해야 할 수도 있지만 일반적으로 좋은 아이디어 여야합니다. – sstan

+1

몇 가지 비틀기를해야했지만 네 생각은 완벽하게 작동했습니다. 감사! – user6745154

관련 문제