Redshift Postgres Window 函数 - rank()

Redshift Postgres Window Function - rank()

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

 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 函数,所以我不确定如何修复它。

有什么建议吗?

您也可以在 lead 函数中使用分区依据:

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'