如果我们只知道user_id,actions_made和访问时间,那么使用PostgreSQL如何查询user_id,开始和结束会话的时间

时间:2017-08-28 12:38:57

标签: sql postgresql

我的任务是打开试用群集Redshift并从csv文件上传数据。

在csv文件中,给出了有关用户ID,访问过的页面和访问时间的信息,最长可达毫秒。

任务是找到所有"会话"用户按给定顺序完成了下一步操作:rooms.homework-showcase,rooms.view.step.content,rooms.lesson.rev.step.content。 (他不能连续做到这一点)。

通过"会话"这意味着行动之间的时间不超过一小时。

输出包括用户ID,会话开始时间和会话结束时间。

csv中提供的示例:

57529,rooms.homework-showcase,2017-03-01T00:00:07.710000
57529,rooms.view.step.content,2017-03-01T00:00:10.275000
57529,rooms.view.step.content,2017-03-01T00:00:10.436000
168671,rooms.view.step.content,2017-03-01T00:00:12.035000
168671,rooms.view.step.content,2017-03-01T00:00:50.632000
64788,rooms.view.step.content,2017-03-01T00:01:21.460000
93698,rooms.view.step.content,2017-03-01T00:02:41.963000
205265,rooms.homework-showcase,2017-03-01T00:02:45.241000
205265,rooms.test-showcase,2017-03-01T00:02:57.854000
205265,notes,2017-03-01T00:03:01.016000

到目前为止我写的

select *, 
case
when timepass IS NULL then ncount
when (timepass>=3600) and lag(timepass<3600) over(order by user_id, datet) 
then ncount
else Null
end as startt,

case
when (timepass<3600) and lead(timepass IS NULL) over(order by user_id, 
datet) then ncount
when (timepass<3600) and lead(timepass>=3600) over(order by user_id, datet) 
then ncount

else Null
end as endt

from
(
select *, row_number() OVER(ORDER BY user_id, datet) as ncount, 
case 
when page_name = 'rooms.homework-showcase' then 0 
when page_name = 'rooms.view.step.content' then 1
when page_name = 'rooms.lesson.rev.step.content' then 2
else 3
end as page_order
from
(
select *, EXTRACT(EPOCH from datet) - lag(EXTRACT(EPOCH from datet)) 
over(partition by user_id order by user_id, datet) as timepass from
(
SELECT *, to_timestamp(date_time, 'YYYY-MM-DD HH:MI:SS:US') as datet from 
testtbl
order by date_time asc
) as t1

group by user_id, page_name, date_time, datet
order by user_id, datet asc 
) as t3
) as t4
;

Output of my query

我可以弄清楚会话的开始和结束(除了我不知道如何将最后一行包括在会话结束时)。一个用户可以有几个会话。

如何查询正确的会话并从中获取user_id,会话的开始和结束?你能给我一些想法吗?我没有足够的SQL知识来查看编写正确查询的方法。

P.S。我已经附上了输出应该是什么样子。这表明特定用户和他的一个会话属于给定标准。而预期的产出是最后的图片。并且应该列出所有&#34; good&#34;会话。

csv文件位于此链接下 https://drive.google.com/open?id=0B288Ep6mrn6fWlQ0a3doV0hjQjA

second

0 个答案:

没有答案