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) 中创建名为“数字”的表?