Попытка агрегировать данные, используя смесь групп по рангу и плотному рангу без удачи - PullRequest
1 голос
/ 21 мая 2019

Я сражаюсь с некоторыми довольно ужасными устаревшими наборами данных, и мне нужно объединить данные, чтобы они были более удобными.Я не слишком уверен, нужен ли мне ранг, плотность_групп или группировка по или комбинация 3. (или что-то новое).

Данные структурированы как:

--[Table:]
hashed_id | visit_id | datetime            | page_name | ...
----------+----------+---------------------+-----------+-----
abc       | 1        | 2019-01-01 00:00:01 | page1     | ...
abc       | 1        | 2019-01-01 00:00:02 | page1     | ...
abc       | 1        | 2019-01-01 00:00:03 | page1     | ...
abc       | 1        | 2019-01-01 00:00:10 | page1     | ...
abc       | 1        | 2019-01-01 00:00:20 | page2     | ...
abc       | 1        | 2019-01-01 00:00:32 | page2     | ...
abc       | 1        | 2019-01-01 00:00:53 | page1     | ...
abc       | 1        | 2019-01-01 00:00:54 | page1     | ...

и яхочу

--[Table:]
hashed_id | visit_id | datetime            | page_name | ...
----------+----------+---------------------+-----------+-----
abc       | 1        | 2019-01-01 00:00:01 | page1     | ...
abc       | 1        | 2019-01-01 00:00:20 | page2     | ...
abc       | 1        | 2019-01-01 00:00:53 | page1     | ... 

Я пытался использовать ранг, плотный ранг и группировать, но, похоже, не получил желаемых результатов.Я что идиот?) 1009

Ответы [ 2 ]

2 голосов
/ 21 мая 2019

Используйте lag(), чтобы получить первый раз, когда появляется страница, которая отличается от предыдущей страницы:

select t.*
from (select t.*,
             lag(page_name) over (partition by hashed_id, visit_id order by datetime) as prev_page_name
      from t
     ) t
where prev_page_name is null or prev_page_name <> page_name
0 голосов
/ 21 мая 2019

выберите для ваших данных, кажется, вам нужно соединение между таблицей и группой min (datetime) по hashed_id, visit_id

select * from my_table  m 
inner join  (
  select  hashed_id, visit_id, min(datetime) min_date 
  from my_table
  group by   hashed_id, visit_id
 ) t 0n t.hashed_id = m.hashed_id 
    and t.visit_id = m.visit_id 
        and t.min_date = m.datetime
...