Сводная таблица на основе указанного c значения события с помощью запроса - PullRequest
3 голосов
/ 05 августа 2020

Я хочу сделать Таблицу А похожей на Таблицу Б. Я хотел бы увидеть, какие события Пользователь вызвал перед событием Покупки. Я использовал row_number() over (partition by client_id, event_type order by time), и это просто опора. Как сделать logi c?

Таблица A

client_id   event_type  count      time 
    A         cart        1     AM 12:00:00 
    A         view        4     AM 12:01:00
    A         purchase    2     AM 12:05:00
    A         view        2     AM 12:10:00 
    B         view        3     AM 12:03:00
    B         purchase    1     AM 12:05:00
    B         view        2     AM 12:10:00 

Таблица B

client_id     view     cart   purchase 
    A           4        1        2     
    A           2        0        0
    B           3        0        1
    B           2        0        0

1 Ответ

1 голос
/ 05 августа 2020

Вот способ сделать это, я определяю группу событий как принадлежащих к одному «сеансу / действию» перед покупкой с использованием блока grp_split.

Затем я правильно выполняю эту группировку в блоке x, заменив нулевые значения на ранее не нулевое значение, используя max (grp) over (разделение по client_id в порядке time1) как grp2.

После этого нужно повернуть столбцы для просмотра, корзины и покупка

with data
  as (
    select 'A' as client_id,'cart'     as event_type   , 1  as count1, cast('AM 12:00:00' as time) as time1 union all 
    select 'A' as client_id,'view'     as event_type   , 4  as count1, cast('AM 12:01:00' as time) as time1 union all
    select 'A' as client_id,'purchase' as event_type   , 2  as count1, cast('AM 12:05:00' as time) as time1 union all
    select 'A' as client_id,'view'     as event_type   , 2  as count1, cast('AM 12:10:00' as time) as time1 union all
    select 'B' as client_id,'view'     as event_type   , 3  as count1, cast('AM 12:03:00' as time) as time1 union all
    select 'B' as client_id,'purchase' as event_type   , 1  as count1, cast('AM 12:05:00' as time) as time1 union all
    select 'B' as client_id,'view' as event_type   , 2  as count1, cast('AM 12:10:00' as time) as time1 
     )
   ,grp_split
   as(
select case when lag(event_type) over(partition by client_id order by time1)='purchase' 
              or lag(event_type) over(partition by client_id order by time1) is null 
             then
                 row_number() over(partition by client_id order by time1)
        end as grp
      ,*
  from data
      )
 select x.client_id
       ,max(case when event_type='view' then count1 else 0 end) as view
       ,max(case when event_type='cart' then count1 else 0 end) as cart
       ,max(case when event_type='purchase' then count1 else 0 end) as purchase
  from (
  select *
        ,max(grp) over(partition by client_id order by time1) as grp2
    from grp_split
       )x
  group by client_id
           ,grp2 
  order by client_id

вывод

+-----------+------+------+----------+
| client_id | view | cart | purchase |
+-----------+------+------+----------+
| A         |    4 |    1 |        2 |
| A         |    2 |    0 |        0 |
| B         |    3 |    0 |        1 |
| B         |    2 |    0 |        0 |
+-----------+------+------+----------+

рабочий пример

https://dbfiddle.uk/?rdbms=postgres_12&fiddle=aeeb0878b9094e061c469bb0efb7a024

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...