仅在特定条件下使用Redshift中的SQL对具有相同名称的行进行分组

时间:2018-11-20 11:05:43

标签: sql group-by amazon-redshift

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

 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中这样做?

非常感谢您的提前帮助

1 个答案:

答案 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