我的任务是打开试用集群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
;
我可以弄清楚会话的开始和结束(除了我不知道如何在会话结束时包括最后一行)。一个用户可以进行多个会话。
如何查询正确的会话并从中获取user_id,会话的开始和结束?你能给我一些想法吗?我对SQL的了解不足,无法了解编写正确查询的方式。
P.S。我已经附加了输出的外观。这显示了特定用户及其属于给定条件的一个会话。预期的输出是最后一张图片。并且应该列出所有“良好”的会话。
csv文件位于此链接https://drive.google.com/open?id=0B288Ep6mrn6fWlQ0a3doV0hjQjA
下DB小提琴https://www.db-fiddle.com/f/bz92LHiTW5RrFBUkaH2KtR/0#&togetherjs=m6SnA9xLSS
答案 0 :(得分:0)
我已经运行了以下通过自我联接使用以下代码提供的示例数据。 下面是代码:
从
中选择user_id,session_begin,max(session_end)作为session_end(选择user_id,session_begin,如果session_end为null,则session_begin否则session_end end作为来自
的session_end(选择a.user_id作为user_id,访问a.datetime,将a.date_time作为session_begin,a.session_hour,当(b.date_time> a.date_time和a.session_hour> = b.date_time)然后b.date_time时空端作为session_end来自
(从页面中选择user_id,trunc(date_time)作为访问日期,date_time,dateadd(hour,1,date_time)session_hour)a
左加入 (从页面中选择user_id,trunc(date_time)作为访问日期,date_time,dateadd(hour,1,date_time)session_hour)b
关于a.user_id = b.user_id和a.datevisited = b.datevisited
按1,2,3,4,5分组)
按1,2,3分组)最终
以1,2为一组;
在您的末端进行测试。有关代码中使用的各种功能,可以参考Redshift文档:https://docs.aws.amazon.com/redshift/latest/dg/r_DATEADD_function.html https://docs.aws.amazon.com/redshift/latest/dg/r_DATEDIFF_function.html