SQL Query для рекурсивного отслеживания месяца покупки - PullRequest
0 голосов
/ 10 марта 2019

У меня есть таблица с идентификатором клиента и месяцем покупки.Для каждого клиента мне сначала нужно сегментировать его по первому месяцу покупки, т. Е. Если клиент совершил свою первую покупку 10 июня 2017 года, то он относится к сегменту июня 2017 года. См. Образец таблицы данных ниже.

Data Table

Затем для каждой последующей покупки этого клиента (скажем, из сегмента июня 2017 года) нам нужно отслеживать месяц.Например, если клиент в июне 2017 года совершил вторую покупку 25 июня 2017 года, а 3-ю покупку - 11 августа 2017 года. Вторая покупка будет засчитана в 1-й месяц (в течение 30 дней после 1-й транзакции), а третья покупка будет засчитана в 3-м месяце., поскольку разница между 11 августа 2017 года и 10 июня 2017 года составляет 62 дня, что составляет от 61 до 90 дней, следовательно, в 3-м месяце.

См. ниже примерную таблицу выходных данных, хотя она мне нужна в процентном виде (%клиента, который сделал в первый месяц, второй месяц и т. д.).В таблице мы показываем всех клиентов, которые сделали свою первую транзакцию, в январе 2017 года, а затем сколько из них совершали транзакции в последующие месяцы.

Output Table

Это отслеживание необходимо выполнить для каждого клиента.Хотя я полагаю, что меня устраивает первая часть, в которой мне нужно сегментировать каждого клиента, я могу сделать это на основе первой или раздела.

Я не уверен, как сделать это рекурсивно для последующих транзакций.

Заранее спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 10 марта 2019

Вы просто используете оконные функции для определения исходного месяца, а затем условного агрегирования.

Вы не упоминаете базу данных, но это идея:

select to_char(first_purchase_date, 'YYYY-MM') as yyyymm,
       sum(case when months_between(first_purchase_date, purchase_date) = 1 then 1 else 0 end) as purchases_1,
       sum(case when months_between(first_purchase_date, purchase_date) = 1 then 1 else 0 end) as purchases_2,
       . . .
from (select t.*,
             min(purchase_date) over (partition by customer_id) as first_purchase_date
      from t
     ) t
group by first_purchase_date;

Я изобрел функции months_between() и to_char(), но вы должны понять.

Вышеуказанные треки покупки . Чтобы получить клиентов, вы можете использовать:

       (count(distinct case when months_between(first_purchase_date, purchase_date) = 1 then customer_id) /
        count(distinct customer_id)
       ) as month_1_ratio
0 голосов
/ 10 марта 2019

Вы можете использовать функцию задержки для создания столбца «предыдущая покупка».

Lag(purchasemonth,1) over(partition. by customerid order by purchasemonth) as [PreviousPurchaseDate]

Тогда просто делайте датировку и ведро, как хотите.

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