使用SQL迭代行

时间:2017-07-13 15:42:53

标签: sql amazon-web-services session amazon-redshift

我在包含事件数据的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是首选。

有没有人知道如何解决这个问题?

1 个答案:

答案 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;