Группировать строки с одинаковыми именами только при определенных условиях с SQL в красном смещении - PullRequest
0 голосов
/ 20 ноября 2018

Теперь у меня есть таблица с данными веб-страницы, которая выглядит следующим образом:

 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 является визитом vaild, и он также будет сгруппирован, что не является желаемым результатом

Я также пытался использовать решение с задержкой и разделом, но проблема

  • Я могу просто получить строку после

  • И количество репликаций отличается между записями, поэтому не может решить ее с помощью фиксированного кода

В целом, я хочу сгруппировать запись, которая имеет тот же путь страницы, который находится в последовательности, и суммировать их, но в то же время сохранить тот же путь страницы, который не является дублированной записью.У кого-нибудь есть идеи, как это сделать в красном смещении?

Большое спасибо за вашу помощь заранее

1 Ответ

0 голосов
/ 20 ноября 2018

Предполагая, что в вашем посте ... означает "а здесь что-то другое" (в отличие от фактического значения "здесь больше того же самого") тогда вы, кажется, хотите "пробелы"-and-острова "решение.

Я выложу ответ, вы увидите, работает ли он.Но объяснение многословно, и вам нужно искать 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

...