Есть ли способ рассчитать коэффициент удержания с помощью оконной функции (sql) - PullRequest
1 голос
/ 13 мая 2019

У меня есть таблица под названием «orders», где я могу найти «customer_id» и «order_date» С 01/04/2019 по 25/01/2019 мы изменили наш интерфейс, и мы хотим видеть влияние на уровень удержания. Чтобы рассчитать коэффициент удержания, я хочу найти всех клиентов, которые заказывали в период с 01/04/2019 по 25/01/2019, и выяснить, сколько из них было заказано в течение 30 дней после их первого заказа.

Я пытался создать запрос для получения этих данных с помощью оконной функции (amazon redshift), но мне не удалось найти решение.

SELECT customer_id, FIRST_VALUE(order_date IGNORE NULLS) 
over (partition by customer_id order by order_date asc rows between unbounded preceding and unbounded following) AS first_order,
NTH_VALUE(order_date, 2)
over(partition by customer_id order by order_date desc
rows between unbounded preceding and unbounded following) AS second_order
FROM il_country_sg.v_fct_orders
WHERE order_date between '20190104' AND '20190226'
GROUP BY customer_id, order_date

Вот что я пытался сделать. Моя проблема в том, что я получаю две последние даты, когда использую функции FIRST_VALUE и NTH_VALUE (2).

Мне нужно использовать функции LAST_VALUE и NTH_VALUE (n-1), но я не знаю, как это сделать. Может быть, у вас есть лучшее решение, чтобы помочь мне:)

Спасибо и хорошего дня!

1 Ответ

1 голос
/ 13 мая 2019

Я хочу найти всех клиентов, которые заказывали в период с 01/04/2019 по 25/01/2019, и узнать, сколько из них было заказано в течение 30 дней после их первого заказа.

Вы можете использовать lead().Такая логика должна дать вам первый заказ для клиентов, которые отвечают условиям вашего вопроса:

SELECT fo.*
FROM (SELECT fo.*,
             LEAD(fo.order_date) OVER (PARTITION BY fo.customer_id ORDER BY fo.order_date) as next_order_date,
             ROW_NUMBER() OVER (PARTITION BY fo.customer_id ORDER BY fo.order_date) as seqnum
      FROM il_country_sg.v_fct_orders fo
      WHERE fo.order_date >= '20190104'
     ) fo
WHERE order_date < '20190226' AND
      seqnum = 1 AND
      DATEDIFF(day, orderdate, next_order_date) <= 30;

Вы можете использовать подзапрос или CTE, чтобы получить количество таких клиентов.

...