Advertisement
gagarin_1982

Untitled

Feb 27th, 2025
43
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. WITH
  2.     -- Параметры для заданного периода времени
  3.     Parameters AS (
  4.         SELECT
  5.             '2024-01-01'::DATE AS start_date,
  6.             '2024-12-31'::DATE AS end_date
  7.     ),
  8.     -- CTE для фильтрации заказов за заданный период времени
  9.     FilteredOrders AS (
  10.         SELECT
  11.             o.customer_id,
  12.             o.order_date,
  13.             o.total_amount,
  14.             o.order_id
  15.         FROM
  16.             orders o
  17.             JOIN Parameters p ON o.order_date BETWEEN p.start_date AND p.end_date
  18.     ),
  19.     -- CTE для расчета давности последнего заказа (Recency)
  20.     Recency AS (
  21.         SELECT
  22.             fo.customer_id,
  23.             MIN(fo.order_date) AS last_order_date,
  24.             DATEDIFF(DAY, MIN(fo.order_date), CURRENT_DATE) AS recency,
  25.             RANK() OVER (ORDER BY DATEDIFF(DAY, MIN(fo.order_date), CURRENT_DATE) ASC) AS recency_rank -- Добавляем ранжирование
  26.         FROM
  27.             FilteredOrders fo
  28.         GROUP BY
  29.             fo.customer_id
  30.     ),
  31.     -- CTE для расчета частоты заказов (Frequency)
  32.     Frequency AS (
  33.         SELECT
  34.             fo.customer_id,
  35.             COUNT(fo.order_id) AS frequency,
  36.             RANK() OVER (ORDER BY COUNT(fo.order_id) DESC) AS frequency_rank -- Добавляем ранжирование
  37.         FROM
  38.             FilteredOrders fo
  39.         GROUP BY
  40.             fo.customer_id
  41.     ),
  42.     -- CTE для расчета финансовой ценности (Monetary)
  43.     Monetary AS (
  44.         SELECT
  45.             fo.customer_id,
  46.             SUM(fo.total_amount) AS monetary,
  47.             RANK() OVER (ORDER BY SUM(fo.total_amount) DESC) AS monetary_rank -- Добавляем ранжирование
  48.         FROM
  49.             FilteredOrders fo
  50.         GROUP BY
  51.             fo.customer_id
  52.     )
  53.     -- Финальный запрос для вывода результатов RFM-анализа
  54. SELECT
  55.     c.customer_name,
  56.     r.recency,
  57.     r.recency_rank, -- Добавляем ранг давности
  58.     f.frequency,
  59.     f.frequency_rank, -- Добавляем ранг частоты
  60.     m.monetary,
  61.     m.monetary_rank, -- Добавляем ранг финансовой ценности
  62.     r.recency_rank + f.frequency_rank + m.monetary_rank AS rfm_total_score -- Добавляем общую оценку RFM
  63. FROM
  64.     customers c
  65.     JOIN Recency r ON c.customer_id = r.customer_id
  66.     JOIN Frequency f ON c.customer_id = f.customer_id
  67.     JOIN Monetary m ON c.customer_id = m.customer_id
  68. ORDER BY
  69.     rfm_total_score ASC, -- Сортируем по общей оценке RFM
  70.     r.recency ASC, -- По давности (чем меньше, тем лучше)
  71.     f.frequency DESC, -- По частоте (чем больше, тем лучше)
  72.     m.monetary DESC; -- По финансовой ценности (чем больше, тем лучше)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement