RFM анализ - стоимость постоянно меняется - PullRequest
0 голосов
/ 17 февраля 2020

Получил следующий запрос.

SELECT
    customer_id,
    NTILE(5) OVER (ORDER BY MAX(oms_order_date)) AS r_score
FROM 
    mdwh.us_raw.l_dmw_order_report
WHERE 
    quantity_ordered > 0
    AND customer_id IS NOT NULL
    AND customer_id != ('')
    AND UPPER(line_status) NOT IN ('','RETURN', 'CANCELLED')
    AND UPPER(item_description_1) NOT IN ('','FREIGHT', 'RETURN LABEL FEE', 'VISIBLE STITCH')
    AND (quantity_ordered * unit_price_amount) > 0
    AND extended_amount < 1000 --NO BULK ORDERS
    AND oms_order_date BETWEEN '2020-01-01' AND '2020-01-01'
    AND SUBSTRING(upc,1,6) IN (SELECT item_code FROM item_master_zs WHERE new_division BETWEEN '11' AND '39')
GROUP BY
    customer_id
ORDER BY
    customer_id

Все, что я здесь делаю, это, учитывая некоторые условия, чтобы дать мне уникальный идентификатор клиента, затем сгруппировать их последнюю дату покупки в квинтили и предоставить мне оценка во втором столбце. Но каждый раз, когда я запускаю запрос, значение r_score постоянно меняется? Что я делаю неправильно..? Вот фрагмент кода таблицы (опять же, значение r_score постоянно меняется):

enter image description here

1 Ответ

1 голос
/ 17 февраля 2020

Проблема с ntile() состоит в том, что она обеспечивает точно одинаковый размер групп, помещая одинаковое значение в разные группы.

По этой причине я обычно делаю вычисление вручную, используя rank():

ceil(rank() over (order by max(oms_order_date)) * 5.0 /
     count(*) over ()
    ) as r_score

Если вы используете row_number(), вы получите эквивалент ntile().

Если вы хотите использовать ntile(), Вы можете использовать дополнительные клавиши order by, чтобы ключи сортировки были уникальными.

==================

2/17 / 20 17:18 РЕДАКТИРОВАТЬ

Вот новый код, который я использую:

SELECT
    customer_id,
    CEIL(RANK() OVER (ORDER BY MAX(oms_order_date)) * 5 / COUNT(*) OVER ()) AS r_score,
    CEIL(RANK() OVER (ORDER BY COUNT(client_web_order_number)) * 5 / COUNT(*) OVER ()) AS f_score,
    CEIL(RANK() OVER (ORDER BY AVG(extended_amount)) * 5 / COUNT(*) OVER ()) AS m_score,
    (r_score || f_score || m_score) AS rfm_score
FROM 
    mdwh.us_raw.l_dmw_order_report t1
WHERE 
    quantity_ordered > 0
    AND customer_id IS NOT NULL
    AND customer_id != ('')
    AND oms_order_date IS NOT NULL
    AND UPPER(line_status) NOT IN ('','RETURN', 'CANCELLED')
    AND UPPER(item_description_1) NOT IN ('','FREIGHT', 'RETURN LABEL FEE', 'VISIBLE STITCH')
    AND (quantity_ordered * unit_price_amount) > 0
    AND extended_amount < 1000 --NO BULK ORDERS
    AND oms_order_date BETWEEN '2020-01-01' AND '2020-01-10'
    AND SUBSTRING(upc,1,6) IN (SELECT item_code FROM item_master_zs WHERE new_division BETWEEN '11' AND '39')
GROUP BY
    customer_id
ORDER BY
    customer_id

Теперь проблема в том, что я получаю некоторые строки с пустым r_score и максимальным значением 4 вместо 5 ..

...