Сводная таблица потоков событий (sql) - PullRequest
0 голосов
/ 26 сентября 2019

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

account_id | order_id | activity_name | activity_date | asc_nbr | desc_nbr
123 | 55 | clicked_page | Sept 15, 2019 | 1 | 4
123 | 55 | clicked_page | Sept 16, 2019 | 2 | 3
123 | 55 | clicked_page | Sept 17, 2019 | 3 | 2
123 | 55 | clicked_page | Sept 18, 2019 | 4 | 1

, и я хочу преобразовать ее в стиль сводной таблицы и показать первую и последнюю дату клика:

account_id | order_id | first_click_date | last_click_date
123 | 55 | Sept 15, 2019 | Sept 18, 2019

Но мой запрос возвращает данные в очень странном формате ... запрос выглядит так:

select account_id
, order_id
, case when activity_name = 'clicked_page' and asc_nbr = 1 then activity_date end as first_click_date
, case when activity_name = 'clicked_page' and desc_nbr = 1 then activity_date end as last_click_date

from table name

^^^ вышеупомянутый запрос возвращает набор данных, который выглядит следующим образом:

account_id | order_id | first_click_date | last_click_date
123 | 55 | Sept 15, 2019 | null
123 | 55 | null | Sept 18, 2019

Я скучаю по группе или что-то здесь?

1 Ответ

1 голос
/ 26 сентября 2019

Вам нужно только условное агрегирование, и не имеет значения, является ли функция агрегации max() или min() (оба дают одинаковый результат):

with test as (
select '123' as account_id, '55' as order_id, 'clicked_page' as activity_name, 'Sept 15, 2019' as activity_date, 1 as asc_nbr, 4 as desc_nbr
union all  
select '123' as account_id, '55' as order_id, 'clicked_page' as activity_name, 'Sept 16, 2019' as activity_date, 2 as asc_nbr, 3 as desc_nbr  
union all  
select '123' as account_id, '55' as order_id, 'clicked_page' as activity_name, 'Sept 17, 2019' as activity_date, 3 as asc_nbr, 2 as desc_nbr  
union all  
select '123' as account_id, '55' as order_id, 'clicked_page' as activity_name, 'Sept 18, 2019' as activity_date, 4 as asc_nbr, 1 as desc_nbr
)  
select account_id,
       order_id,
       min(case
             when activity_name = 'clicked_page' and asc_nbr = 1 then
               activity_date
             end) as first_click_date,
       max(case
             when activity_name = 'clicked_page' and desc_nbr = 1 then
              activity_date
             end) as last_click_date
  from tab
 group by account_id, order_id 
...