【问题标题】:Redshift Postgres Window Function - rank()Redshift Postgres 窗口函数 - 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?
  • 有人建议。
  • 您可能想要显示一些示例输入。
  • 明白了。谢谢。

标签: sql amazon-redshift window-functions


【解决方案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'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 2017-08-14
    • 2020-03-12
    • 1970-01-01
    相关资源
    最近更新 更多