我试图查询事件数据库以确定用户的第一个事件,以及他们在第一个事件之后触发的下两个事件。数据库中的每个事件都有一个名称,时间戳和关联用户:
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 Functions,所以我不确定如何修复它。
有什么建议吗?
答案 0 :(得分:2)
您也可以在引导功能中使用分区:
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'