仅在特定条件下,将具有相同名称的行分组,SQL处于红移状态



现在我有一个网页数据表,如下所示:

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

最新更新