现在我有一个网页数据表,如下所示:
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页是无效的访问,它也将被分组,这不是所需的结果
我也尝试使用滞后和分区解决方案,但问题是
我只能得到之后的行
并且记录之间的复制次数不同,因此无法通过固定代码解决
总的来说,我想将具有相同页面路径的记录分组,并将它们相加,但同时保持相同的页面路径,这不是重复的记录。有人知道如何在红移中做到这一点吗?
非常感谢您提前提供的帮助
假设在你的帖子中...
的意思是"这里有不同的东西">(与"这里更一样"的实际意思相反(,那么你似乎想要一个"缺口和岛屿"的解决方案。
我会公布答案,你看看它是否有效。但解释很冗长,您需要在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=1d47a59b33bbfae11ba3400f392ec9c5