首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用SQL遍历行

使用SQL遍历行
EN

Stack Overflow用户
提问于 2017-07-13 23:42:53
回答 1查看 132关注 0票数 1

我在Redshift数据库中有一个包含事件数据的表。每行都是一个事件。每个事件都有eventid,但不是我现在需要的sessionid。我已经提取了表的一个示例(列的子集,只有一个userid中的事件):

代码语言:javascript
复制
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是首选。

有没有人能告诉我如何解决这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-13 23:44:39

我认为只使用sessionstart可能更简单--假设会话开始和会话结束之间没有事件。

如果是这样的话:

代码语言:javascript
复制
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:

代码语言:javascript
复制
select e.*
       sum(case when sessionstart then 1 else 0 end) over (order by userid, time) as user_sessionid
from events e;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45085461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档