사용자가 연속으로 몇 분 동안 로그인했는지 확인하기 위해 세션 길이를 확인하려고합니다. 문제는 세션이 활동별로 행으로 나뉘어져 있다는 것입니다. 활동 종료가 다음 행 활동 시작과 동일하면 동일한 세션의 일부이며 함께 계산되어야합니다.
이상적으로는 다음과 같습니다. 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이 증가하도록하려면 어떻게해야합니까?
MySQL 데이터베이스를 사용하는 것으로 질문에 태그를 지정했지만, dense_rank()
window 함수를 사용하여 "성공적인"쿼리를 수행했다는 사실 은 이것이 MySQL이 아님을 분명히 알려줍니다. MySQL은 현재 창 기능을 지원하지 않습니다.
그래도 데이터베이스가 무엇이든 Windows 기능을 지원한다는 사실을 기반으로 계속해서 lag
및 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
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다