我在Redshift数据库中有一个包含事件数据的表。每行都是一个事件。每个事件都有eventid,但不是我现在需要的sessionid。我已经提取了表的一个示例(列的子集,只有一个userid中的事件):
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
这是按用户in和时间排序的,以便根据会话活动以正确的顺序显示事件。每个事件都有sessionstart和sessionstop的布尔值。通过查看事件列表,我可以通过查找sessionstart=true和sessionstop=true内(包括)的所有事件来识别会话。在这里列出的事件中,有两个会话。第一个会话以eventid 504747459开始,以781472797结束。第二个会话以eventid 1826568537开始,以578922176结束。我想要做的是使用SQL用sessionid标记这两个会话(以及所有其他会话)。我还没有找到任何使用SQL来实现这一点的方法。使用eg是可能的。Python,但我相信它的性能会很差。因此,SQL是首选。
有没有人能告诉我如何解决这个问题?
发布于 2017-07-13 23:44:39
我认为只使用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;
这在每个用户中提供了一个会话。如果用户总是从新的会话开始(合理的假设),那么很容易将其扩展为全局会话id:
select e.*
sum(case when sessionstart then 1 else 0 end) over (order by userid, time) as user_sessionid
from events e;
https://stackoverflow.com/questions/45085461
复制相似问题