我在包含事件数据的Redshift数据库中有一个表。每行是一个事件。每个事件都有偶数,但不是我现在需要的sessionid。我已经提取了一个表的示例(列的一个子集,只有一个用户ID的事件):
time userid eventid sessionstart sessiontop
1498639773 101xnmnd1ohi62 504747459 t f
1498639777 101xnmnd1ohi62 1479311450 f f
1498639803 101xnmnd1ohi62 808610184 f f
1498639816 101xnmnd1ohi62 335000637 f f
1498639903 101xnmnd1ohi62 238269920 f f
1498639906 101xnmnd1ohi62 990687838 f f
1498639952 101xnmnd1ohi62 781472797 f t
1498650109 101xnmnd1ohi62 1826568537 t f
1498650124 101xnmnd1ohi62 2079795673 f f
1498650365 101xnmnd1ohi62 578922176 f t
按用户ID和时间排序,以便根据会话活动以正确的顺序显示事件。每个事件都有sessionstart和sessionstop的布尔值。通过查看事件列表,我可以通过查找(包括)sessionstart = true和sessionstop = true内的所有事件来识别会话。在此处列出的活动中,有两个会话。第一个会话以eventid 504747459开始,以781472797结束。第二个会话以eventid 1826568537开始,以578922176结束。我想要做的是使用SQL将这两个会话(以及所有其他会话)标记为sessionid。我还没有找到任何使用SQL的方法。可以使用例如。 Python,但我相信性能会很差。因此SQL是首选。
有没有人知道如何解决这个问题?
答案 0 :(得分:0)
我认为使用sessionstart
可能更容易 - 假设会话开始和会话结束之间没有事件。
如果是这样的话:
select e.*
sum(case when sessionstart then 1 else 0 end) over (partition by userid order by time) as user_sessionid
from events e;
这为每个用户“提供”了一个sessionid。如果用户总是以新会话开始(合理的假设),那么这很容易扩展到全局会话ID:
select e.*
sum(case when sessionstart then 1 else 0 end) over (order by userid, time) as user_sessionid
from events e;