现在我有一个包含网页数据的表格,如下所示:
Visitor_ID Visit_ID visit_time pagepath page seq timestart timeend
0001 0111 2018-11-19 /homepage 1 ... ...
0001 0111 2018-11-19 /someotherpage 2 ... ...
0001 0111 2018-11-19 /product 3 2018-11-19 23:05 2018-11-19 23:15
0001 0111 2018-11-19 /product 4 2018-11-19 23:15 2018-11-19 23:16
0001 0111 2018-11-19 /product 5 2018-11-19 23:16 2018-11-19 23:17
0001 0111 2018-11-19 /someotherpage 6 ... ...
0001 0111 2018-11-19 /someotherpage 7 ... ...
0001 0111 2018-11-19 /product 8 2018-11-19 23:25 2018-11-19 23:26
原始数据中有一个错误,某些页面被复制了,我想要的是对复制进行分组,这就像页面序列3、4、5那样按顺序进行,并且总结了浏览时间,例如:
Visitor_ID Visit_ID visit_time pagepath page seq timestart timeend
0001 0111 2018-11-19 /product 3 2018-11-19 23:05 2018-11-19 23:17
...
...
0001 0111 2018-11-19 /product 8 2018-11-19 23:25 2018-11-19 23:26
我使用了分组依据并取了最小值。但是问题是,在这种情况下,第8页是无效的访问,并且也会将其分组,这不是期望的结果
我也尝试使用滞后和分区解决方案,但问题是
我可以在
并且记录之间的复制次数不同,因此无法通过固定代码解决
总的来说,我想将记录与序列上相同的页面路径进行分组并进行汇总,但同时保留相同的页面路径,而不是重复的记录。有没有人知道如何在redshift中这样做?
非常感谢您的提前帮助
答案 0 :(得分:1)
假设您的帖子...
中的意思是“这里有些不同”(与“这里有更多相同之处”的实际含义相反),那么您似乎想要一种“空缺”的解决方案。
我将发布答案,您看是否可行。但是解释很长,您需要在SO中搜索其他gaps-and-islands
答案才能找到各种解释。
SELECT
Visitor_ID,
Visit_ID,
MIN(visit_time) AS visit_time,
pagepath,
MIN(page_seq) AS page_seq,
MIN(timestart) AS timestart,
MAX(timeend) AS timeend
FROM
(
SELECT
*,
ROW_NUMBER() OVER (PARTITION BY Visitor_ID, Visit_ID, pagepath
ORDER BY page_seq
)
AS pagepath_seq
FROM
yourTable
)
AS sequenced
GROUP BY
Visitor_ID,
Visit_ID,
pagepath,
pagepath_seq - page_seq
(假设page_seq
从1开始,从没有任何间隔,并且为每个Visitor_ID / Visit_ID“重新启动”。)
示例:https://dbfiddle.uk/?rdbms=postgres_8.4&fiddle=1d47a59b33bbfae11ba3040f392ec9c5