2017-02-08 51 views
0

我想查询一个事件数据库以确定用户的第一个事件,以及他们在第一个事件后触发的接下来的2个事件。数据库中的每个事件都有一个名字,时间戳和相关的用户:Redshift Postgres窗口函数 - 秩()

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'