Redshift Postgres窗口函数 - rank()

时间:2017-02-08 16:07:25

标签: sql amazon-redshift window-functions

我试图查询事件数据库以确定用户的第一个事件,以及他们在第一个事件之后触发的下两个事件。数据库中的每个事件都有一个名称,时间戳和关联用户:

 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子句,结果就会不正确; " next"事件不正确,我可以通过对任何特定用户运行查询来检查。感觉rank()函数混合了event_times,但这是我第一次使用Window Functions,所以我不确定如何修复它。

有什么建议吗?

1 个答案:

答案 0 :(得分: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'