как создать таблицу удержания клиентов / когортный анализ с помощью SQL - PullRequest
0 голосов
/ 01 июня 2019

Я пытаюсь написать запрос SQL (синтаксис Presto SQL), чтобы создать таблицу удержания клиентов (см. Пример ниже).Клиент, который совершает хотя бы одну транзакцию в месяц, считается удержанным за этот месяц.

это таблица

user_id       transaction_date
bdcff651- .   2018-01-01
bdcff641 .     2018-03-15

это результат, который я хотел бы получить

В первой строке следует понимать следующее: Из всех клиентов, которые сделали свою первую транзакцию в январе 2018 г. (определенную как «группа активации Jan»), 35% впоследствии совершили транзакцию в течение одного месяца после ихдата первой транзакции, 23% в следующем месяце, 15% в следующем месяце и т. д.

  Date         1st Month   2nd Month       3rd Month

2018-01-01      35%               23% .         15%
2018-02-0       33 %             26% .         13%
2018-03-0       36%               27%           12%

Например, если человек XYZ совершит свою первую транзакцию 10 февраля 2018 года, его первый месяц будетбудет с 11 февраля 2018 года по 10 марта 2018 года, 2-й месяц будет с 11 марта 2018 года по 10 апреля 2018 года и так далее.Данные этого человека должны быть указаны в когорте за февраль 2018 года в таблице удержания клиентов.

будет признателен за любую помощь!спасибо.

Ответы [ 2 ]

1 голос
/ 02 июня 2019

Вы можете использовать условное агрегирование.Однако я не уверен, каковы ваши реальные расчеты.

Если я просто использую встроенные определения date_diff(), то логика выглядит следующим образом:

select date_trunc(month, first_td) as yyyymm,
       count(distinct user_id) as cnt,
       (count(distinct case when date_diff(month, first_td, transaction_date) = 1
                            then user_id
                       end) /
        count(distinct user_id)
       ) as month_1_ratio,
       (count(distinct case when date_diff(month, first_td, transaction_date) = 2
                            then user_id
                       end) /
        count(distinct user_id)
       ) as month_2_ratio
from (select t.*,
             min(transaction_date) over (partition by user_id) as first_td
      from t
     ) t
group by date_trunc(month, first_td)
order by yyyymm;
1 голос
/ 01 июня 2019

Я точно не знаком с Presto, и у меня нет способа проверить код Presto. Однако, если немного поискать, то кажется, что преобразовать в синтаксис Presto из чего-то вроде синтаксиса SQL Server не составит большого труда. Вот что я буду делать в SQL Server, и вы сможете перенести эту концепцию в Presto:

with transactions_info_per_user as (
select user_id, min(transaction_date) as first_transaction, 
       convert(datepart(year, min(transaction_date)) as varchar(4)) + convert(datepart(month, min(transaction_date)) as varchar(2)) as activation_cohort
from my_table
group by user_id
),

users_per_activation_cohort as (
select activation_cohort, count(*) as number_of_users
from transactions_info_per_user
group by activation_cohort
),

months_after_activation_per_purchase as (
select distinct mt.user_id, ti.activation_cohort, datediff(month, mt.transaction_date, ti.first_transaction) AS months_after_activation
from my_table mt
left join transactions_info_per_user as ti
on mt.user_id = ti.user_id
),

final as (
select activation_cohort, months_after_activation, count(*) as user_count_per_cohort_with_purchase_per_month_after_activation
from months_after_activation_per_purchase 
group by activation_cohort, months_after_activation
)

select activation_cohort, months_after_activation, 
       convert(user_count_per_cohort_with_purchase_per_month_after_activation as decimal(9,2)) / convert(users_per_activation_cohort as decimal(9,2)) * 100
from final

--Then pivot months_after_activation into columns 

Я был очень четко назван, чтобы вы могли следить за процессом мышления. Здесь - пример того, как вращаться в Presto. Надеюсь, это поможет вам!

...