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'
我正在尝试查询事件数据库以确定用户的第一个事件,以及他们在第一个事件之后触发的接下来的 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'