2017-02-08 1 views
0

사용자의 첫 번째 이벤트를 결정하기 위해 이벤트 데이터베이스를 쿼리하고 첫 번째 이벤트 이후에 발생하는 다음 2 개의 이벤트를 쿼리하려고합니다.Redshift Postgres 윈도우 함수 - rank()

event_user event_time  event_name 
---------- ----------  ---------- 
some_id  1000   1st_event 
some_id  1005   2nd_event 
another_id 1003   1st_event 
some_id  1010   3rd_event 
another_id 1007   2nd_event 
some_id  1015   4th_event 
some_id  1100   5th_event 

하는 나는 다음과 같은 경우 :

:
SELECT event_user 
    , event_time 
    , rank() over (partition by event_user order by event_time asc) as rank 
    , event_name 
    , lead(event_name, 1) over (order by event_time) as event_2 
    , lead(event_name, 2) over (order by event_time) as event_3 
FROM event_table 
WHERE event_name = 'some_specific_event' 
    AND event_user = 'some_id' 

내가 'SOME_ID'와 사용자에 대한 올바른 결과를 얻을 데이터베이스의 각 이벤트는 이름, 타임 스탬프 및 관련 사용자가
event_user event_name event_time  rank  event_2  event_3 
---------- ---------- ----------  ----  -------  ------- 
some_id  1st_event  1000   1  2nd_event 3rd_event 
some_id  2nd_event  1005   2  3rd_event 4th_event 
some_id  3rd_event  1010   3  4th_event 5th_event 
.... 

내 목표는 마다 사용자 순위 1 레코드 (처음 3 이벤트)를 얻을 수있는 하위 쿼리로 사용하는 것입니다

SELECT * FROM (above query) WHERE query.rank = 1 

그러나 사용자를 지정하는 WHERE 절을 제거하면 결과가 잘못됩니다. "다음"이벤트가 올바르지 않습니다. 특정 사용자에 대한 쿼리를 실행하여 확인할 수 있습니다. rank() 함수가 event_times를 섞어 놓고있는 것처럼 느껴지 긴하지만 이것이 Window 함수에 대한 나의 첫 번째 경험이므로이를 수정하는 방법을 모르겠습니다.

제안 사항?

+0

우리가 물어 봐도 될까요 당신이이 함수를하지 않는 MySQL의 태그 이유는 무엇입니까? –

+0

제안되었습니다. –

+1

몇 가지 샘플 입력을 보여줄 수 있습니다. –

답변

2

당신은뿐만 아니라 리드 기능에 의해 파티션을 사용할 수 있습니다

SELECT event_user 
    , event_time 
    , rank() over (partition by event_user order by event_time asc) as rank 
    , event_name 
    , lead(event_name, 1) over (partition by event_user order by event_time) as event_2 
    , lead(event_name, 2) over (partition by event_user order by event_time) as event_3 
FROM event_table 
WHERE event_name = 'some_specific_event' 
    AND event_user = 'some_id'