我在Redshift中有一个基于事件的表。我希望将所有事件与系列中的FIRST事件联系起来,前提是事件发生在此事件之前的N小时内。
如果我关心的只是非常的第一行,我只是这样做:
SELECT
event_time
,first_value(event_time)
OVER (ORDER BY event_time rows unbounded preceding) as first_time
FROM
my_table
但是因为我只想把它与过去N小时的第一个事件联系起来,我想要的是:
SELECT
event_time
,first_value(event_time)
OVER (ORDER BY event_time rows between [N-hours ago] and current row) as first_time
FROM
my_table
我的桌子上有一点背景。它是用户操作,因此用户有效地跳转,执行1-100个操作,然后离开。大多数用户每天1-10次。会话很少持续一个多小时,所以我可以设置N = 1。
如果我只是设置一个PARTITION BY date_trunc(' hour',event_time),我会为跨越一小时的会话创建双倍。
假设my_table看起来像
id | user_id | event_time
----------------------------------
1 | 123 | 2015-01-01 01:00:00
2 | 123 | 2015-01-01 01:15:00
3 | 123 | 2015-01-01 02:05:00
4 | 123 | 2015-01-01 13:10:00
5 | 123 | 2015-01-01 13:20:00
6 | 123 | 2015-01-01 13:30:00
我的目标是获得看起来像
的结果id | parent_id | user_id | event_time
----------------------------------
1 | 1 | 123 | 2015-01-01 01:00:00
2 | 1 | 123 | 2015-01-01 01:15:00
3 | 1 | 123 | 2015-01-01 02:05:00
4 | 4 | 123 | 2015-01-01 13:10:00
5 | 4 | 123 | 2015-01-01 13:20:00
6 | 4 | 123 | 2015-01-01 13:30:00
答案 0 :(得分:3)
截至目前,答案似乎是“不”。
SQL Server中有一个在框架中使用RANGE而不是ROWS的功能。这允许查询将值与当前行的值进行比较。
https://www.simple-talk.com/sql/learn-sql-server/window-functions-in-sql-server-part-2-the-frame/
当我在Redshift中尝试这种语法时,我得到“范围尚不支持”的错误
有人在“尚未”改变时更新此内容!