Redshift Postgres 窗口函数 - rank()

Posted

技术标签:

【中文标题】Redshift Postgres 窗口函数 - rank()【英文标题】:Redshift Postgres Window Function - rank() 【发布时间】:2017-02-08 16:07:25 【问题描述】:

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

 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,但这是我第一次使用窗口函数,所以我不知道如何解决它。

有什么建议吗?

【问题讨论】:

请问您为什么要标记没有这些功能的 mysql 有人建议。 您可能想要显示一些示例输入。 明白了。谢谢。 【参考方案1】:

您也可以在前导功能中使用分区:

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'

【讨论】:

以上是关于Redshift Postgres 窗口函数 - rank()的主要内容,如果未能解决你的问题,请参考以下文章

R:如何使用 dplyr(函数 scr_postgres)从 redshift 中的模式中选择表?

在窗口函数中计算运行总和

REDSHIFT:如何生成一系列数字而不在 redshift (Postgres 8.0.2) 中创建名为“数字”的表?

Redshift - 带条件的最大窗口函数

将 Postgres RDS 模式复制到 Redshift

Redshift 中的重叠函数