mirror of
https://gitlab.com/cief-data/dbt_cloud.git
synced 2026-08-19 04:14:00 +00:00
303 lines
16 KiB
SQL
303 lines
16 KiB
SQL
-- AVAILABLE FILTER VALUE
|
|
-- Alot of companies do not have
|
|
{% set custom_one_year_from_date = modules.datetime.datetime.now(modules.pytz.timezone("Asia/Kuala_Lumpur")).date() - modules.datetime.timedelta(365) %}
|
|
{% set custom_one_year_to_date = modules.datetime.datetime.now(modules.pytz.timezone("Asia/Kuala_Lumpur")).date() %}
|
|
|
|
-- RFM list values defined using percentile from dashboard [SHIPPING] rfm
|
|
{% set recency_list_lifetime = [120,240,360,480] %}
|
|
{% set frequency_list_lifetime = [1,2,8,24] %}
|
|
{% set monetary_list_lifetime = [0.74,3.01,7.87,27.27] %}
|
|
|
|
{% set recency_list_one_year = [120,240,360,480] %}
|
|
{% set frequency_list_one_year = [1,2,7,16] %}
|
|
{% set monetary_list_one_year = [0.76,3.00,7.36,22.80] %}
|
|
|
|
|
|
-- IMPORT
|
|
WITH origin_warehouse_shipping_packing_lists AS (
|
|
SELECT * FROM {{ ref('fct_shipping__origin_warehouse_shipping_packing_lists') }}
|
|
),
|
|
|
|
companies AS (
|
|
SELECT * FROM {{ ref('dim_shipping__companies') }}
|
|
),
|
|
|
|
|
|
-- LOGIC
|
|
company_shipping_order_one_year AS(
|
|
|
|
SELECT
|
|
origin_warehouse_shipping_packing_lists.sub_company_id,
|
|
companies.sub_company_marking_id,
|
|
COUNT(origin_warehouse_shipping_packing_lists.origin_warehouse_shipping_packing_list_id) AS number_of_packing_list_one_year,
|
|
MAX(origin_warehouse_shipping_packing_lists.origin_warehouse_shipping_order_created_datetime) AS last_packing_list_created_datetime_one_year,
|
|
DATEDIFF(day, last_packing_list_created_datetime_one_year, CURRENT_DATE()) AS day_after_last_packing_list_one_year,
|
|
SUM(origin_warehouse_shipping_packing_lists.total_package_cbm) AS total_package_cbm_one_year
|
|
|
|
FROM origin_warehouse_shipping_packing_lists
|
|
|
|
LEFT JOIN companies
|
|
ON (origin_warehouse_shipping_packing_lists.sub_company_id = companies.sub_company_id)
|
|
|
|
WHERE
|
|
origin_warehouse_shipping_order_status IN ('COMPLETED','APPROVED')
|
|
AND
|
|
origin_warehouse_shipping_order_created_datetime >= '{{ custom_one_year_from_date }}'
|
|
AND
|
|
origin_warehouse_shipping_order_created_datetime < '{{ custom_one_year_to_date }}'
|
|
|
|
GROUP BY
|
|
origin_warehouse_shipping_packing_lists.sub_company_id,
|
|
companies.sub_company_marking_id
|
|
|
|
),
|
|
|
|
company_rfm AS (
|
|
|
|
SELECT
|
|
origin_warehouse_shipping_packing_lists.sub_company_id,
|
|
companies.sub_company_marking_id,
|
|
|
|
MAX(origin_warehouse_shipping_packing_lists.origin_warehouse_shipping_order_created_datetime) AS last_packing_list_created_datetime,
|
|
|
|
DATEDIFF(day, last_packing_list_created_datetime, CURRENT_DATE() ) AS day_after_last_packing_list_lifetime,
|
|
MAX(company_shipping_order_one_year.day_after_last_packing_list_one_year) AS day_after_last_packing_list_one_year,
|
|
|
|
COUNT(origin_warehouse_shipping_packing_lists.origin_warehouse_shipping_packing_list_id) AS number_of_packing_list_lifetime,
|
|
MAX(company_shipping_order_one_year.number_of_packing_list_one_year) AS number_of_packing_list_one_year,
|
|
|
|
SUM(origin_warehouse_shipping_packing_lists.total_package_cbm) AS total_package_cbm_lifetime,
|
|
MAX(company_shipping_order_one_year.total_package_cbm_one_year) AS total_package_cbm_one_year
|
|
|
|
FROM origin_warehouse_shipping_packing_lists
|
|
|
|
LEFT JOIN company_shipping_order_one_year
|
|
ON (origin_warehouse_shipping_packing_lists.sub_company_id = company_shipping_order_one_year.sub_company_id)
|
|
|
|
LEFT JOIN companies
|
|
ON (origin_warehouse_shipping_packing_lists.sub_company_id = companies.sub_company_id)
|
|
|
|
WHERE
|
|
origin_warehouse_shipping_packing_lists.origin_warehouse_shipping_order_status IN ('COMPLETED','APPROVED')
|
|
|
|
GROUP BY
|
|
origin_warehouse_shipping_packing_lists.sub_company_id,
|
|
companies.sub_company_marking_id
|
|
|
|
),
|
|
|
|
calculate_rfm AS (
|
|
|
|
SELECT
|
|
*,
|
|
|
|
CASE
|
|
WHEN day_after_last_packing_list_lifetime <= {{recency_list_lifetime[0]}} THEN 5
|
|
WHEN (day_after_last_packing_list_lifetime > {{recency_list_lifetime[0]}} AND day_after_last_packing_list_lifetime <= {{recency_list_lifetime[1]}}) THEN 4
|
|
WHEN (day_after_last_packing_list_lifetime > {{recency_list_lifetime[1]}} AND day_after_last_packing_list_lifetime <= {{recency_list_lifetime[2]}}) THEN 3
|
|
WHEN (day_after_last_packing_list_lifetime > {{recency_list_lifetime[2]}} AND day_after_last_packing_list_lifetime <= {{recency_list_lifetime[3]}}) THEN 2
|
|
WHEN day_after_last_packing_list_lifetime > {{recency_list_lifetime[3]}} THEN 1
|
|
ELSE -999
|
|
END AS r_score_lifetime,
|
|
|
|
CASE
|
|
WHEN number_of_packing_list_lifetime <= {{frequency_list_lifetime[0]}} THEN 1
|
|
WHEN (number_of_packing_list_lifetime > {{frequency_list_lifetime[0]}} AND number_of_packing_list_lifetime <= {{frequency_list_lifetime[1]}}) THEN 2
|
|
WHEN (number_of_packing_list_lifetime > {{frequency_list_lifetime[1]}} AND number_of_packing_list_lifetime <= {{frequency_list_lifetime[2]}}) THEN 3
|
|
WHEN (number_of_packing_list_lifetime > {{frequency_list_lifetime[2]}} AND number_of_packing_list_lifetime <= {{frequency_list_lifetime[3]}}) THEN 4
|
|
WHEN number_of_packing_list_lifetime > {{frequency_list_lifetime[3]}} THEN 5
|
|
ELSE -999
|
|
END AS f_score_lifetime,
|
|
|
|
CASE
|
|
WHEN total_package_cbm_lifetime <= {{monetary_list_lifetime[0]}} THEN 1
|
|
WHEN (total_package_cbm_lifetime > {{monetary_list_lifetime[0]}} AND total_package_cbm_lifetime <= {{monetary_list_lifetime[1]}}) THEN 2
|
|
WHEN (total_package_cbm_lifetime > {{monetary_list_lifetime[1]}} AND total_package_cbm_lifetime <= {{monetary_list_lifetime[2]}}) THEN 3
|
|
WHEN (total_package_cbm_lifetime > {{monetary_list_lifetime[2]}} AND total_package_cbm_lifetime <= {{monetary_list_lifetime[3]}}) THEN 4
|
|
WHEN total_package_cbm_lifetime > {{monetary_list_lifetime[3]}} THEN 5
|
|
ELSE -999
|
|
END AS m_score_lifetime,
|
|
|
|
CASE
|
|
WHEN (r_score_lifetime = 5) AND (f_score_lifetime = 5) AND (m_score_lifetime = 5)
|
|
THEN '1_King'
|
|
|
|
WHEN (r_score_lifetime BETWEEN 2 AND 3) AND (f_score_lifetime = 1) AND (m_score_lifetime = 1)
|
|
THEN '10_At Cheap Risk'
|
|
|
|
WHEN (r_score_lifetime = 1) AND (f_score_lifetime = 1) AND (m_score_lifetime = 1)
|
|
THEN '13_Cheap Lost'
|
|
|
|
WHEN (r_score_lifetime BETWEEN 4 AND 5) AND (f_score_lifetime BETWEEN 1 AND 2) AND (m_score_lifetime BETWEEN 4 AND 5)
|
|
THEN '4_Whale'
|
|
|
|
WHEN (r_score_lifetime BETWEEN 4 AND 5) AND (f_score_lifetime BETWEEN 4 AND 5) AND (m_score_lifetime BETWEEN 1 AND 2)
|
|
THEN '3_Sardine'
|
|
|
|
WHEN (r_score_lifetime BETWEEN 4 AND 5) AND (f_score_lifetime BETWEEN 3 AND 5) AND (m_score_lifetime BETWEEN 3 AND 5)
|
|
THEN '2_Loyal Customer'
|
|
|
|
WHEN (r_score_lifetime BETWEEN 4 AND 5) AND (f_score_lifetime BETWEEN 2 AND 5) AND (m_score_lifetime BETWEEN 2 AND 5)
|
|
THEN '5_Potention Loyal'
|
|
|
|
WHEN (r_score_lifetime = 5) AND (f_score_lifetime = 1) AND (m_score_lifetime BETWEEN 1 AND 2)
|
|
THEN '7_New Customer'
|
|
|
|
WHEN (r_score_lifetime BETWEEN 2 AND 3) AND (f_score_lifetime BETWEEN 4 AND 5) AND (m_score_lifetime BETWEEN 4 AND 5)
|
|
THEN '8_At High Risk'
|
|
|
|
WHEN (r_score_lifetime BETWEEN 2 AND 3) AND (f_score_lifetime BETWEEN 1 AND 5) AND (m_score_lifetime BETWEEN 1 AND 5)
|
|
THEN '9_At Risk'
|
|
WHEN (r_score_lifetime BETWEEN 2 AND 3) AND (f_score_lifetime = 1) AND (m_score_lifetime BETWEEN 1 AND 2)
|
|
THEN '9_At Risk'
|
|
WHEN (r_score_lifetime BETWEEN 2 AND 3) AND (f_score_lifetime BETWEEN 1 AND 2) AND (m_score_lifetime = 1)
|
|
THEN '9_At Risk'
|
|
|
|
WHEN (r_score_lifetime = 1) AND (f_score_lifetime BETWEEN 4 AND 5) AND (m_score_lifetime BETWEEN 1 AND 5)
|
|
THEN '11_Cant Lose Them'
|
|
WHEN (r_score_lifetime = 1) AND (f_score_lifetime BETWEEN 1 AND 5) AND (m_score_lifetime BETWEEN 4 AND 5)
|
|
THEN '11_Cant Lose Them'
|
|
WHEN (r_score_lifetime = 1) AND (f_score_lifetime BETWEEN 3 AND 5) AND (m_score_lifetime BETWEEN 3 AND 5)
|
|
THEN '11_Cant Lose Them'
|
|
|
|
WHEN (r_score_lifetime = 1) AND (f_score_lifetime BETWEEN 1 AND 3) AND (m_score_lifetime BETWEEN 1 AND 3)
|
|
THEN '12_Lost'
|
|
|
|
WHEN (r_score_lifetime BETWEEN 4 AND 5) AND (f_score_lifetime = 1) AND (m_score_lifetime BETWEEN 1 AND 3)
|
|
THEN '6_Normal Customer'
|
|
WHEN (r_score_lifetime BETWEEN 4 AND 5) AND (f_score_lifetime BETWEEN 1 AND 3) AND (m_score_lifetime = 1)
|
|
THEN '6_Normal Customer'
|
|
|
|
ELSE 'ERROR Please Contact DATA Team'
|
|
END AS segment_lifetime,
|
|
|
|
CASE
|
|
WHEN day_after_last_packing_list_one_year IS NULL THEN NULL
|
|
WHEN day_after_last_packing_list_one_year <= {{recency_list_one_year[0]}} THEN 5
|
|
WHEN (day_after_last_packing_list_one_year > {{recency_list_one_year[0]}} AND day_after_last_packing_list_one_year <= {{recency_list_one_year[1]}}) THEN 4
|
|
WHEN (day_after_last_packing_list_one_year > {{recency_list_one_year[1]}} AND day_after_last_packing_list_one_year <= {{recency_list_one_year[2]}}) THEN 3
|
|
WHEN (day_after_last_packing_list_one_year > {{recency_list_one_year[2]}} AND day_after_last_packing_list_one_year <= {{recency_list_one_year[3]}}) THEN 2
|
|
WHEN day_after_last_packing_list_one_year > {{recency_list_one_year[3]}} THEN 1
|
|
ELSE -999
|
|
END AS r_score_one_year,
|
|
|
|
CASE
|
|
WHEN number_of_packing_list_one_year IS NULL THEN NULL
|
|
WHEN number_of_packing_list_one_year <= {{frequency_list_one_year[0]}} THEN 1
|
|
WHEN (number_of_packing_list_one_year > {{frequency_list_one_year[0]}} AND number_of_packing_list_one_year <= {{frequency_list_one_year[1]}}) THEN 2
|
|
WHEN (number_of_packing_list_one_year > {{frequency_list_one_year[1]}} AND number_of_packing_list_one_year <= {{frequency_list_one_year[2]}}) THEN 3
|
|
WHEN (number_of_packing_list_one_year > {{frequency_list_one_year[2]}} AND number_of_packing_list_one_year <= {{frequency_list_one_year[3]}}) THEN 4
|
|
WHEN number_of_packing_list_one_year > {{frequency_list_one_year[3]}} THEN 5
|
|
ELSE -999
|
|
END AS f_score_one_year,
|
|
|
|
CASE
|
|
WHEN total_package_cbm_one_year IS NULL THEN NULL
|
|
WHEN total_package_cbm_one_year <= {{monetary_list_one_year[0]}} THEN 1
|
|
WHEN (total_package_cbm_one_year > {{monetary_list_one_year[0]}} AND total_package_cbm_one_year <= {{monetary_list_one_year[1]}}) THEN 2
|
|
WHEN (total_package_cbm_one_year > {{monetary_list_one_year[1]}} AND total_package_cbm_one_year <= {{monetary_list_one_year[2]}}) THEN 3
|
|
WHEN (total_package_cbm_one_year > {{monetary_list_one_year[2]}} AND total_package_cbm_one_year <= {{monetary_list_one_year[3]}}) THEN 4
|
|
WHEN total_package_cbm_one_year > {{monetary_list_one_year[3]}} THEN 5
|
|
ELSE -999
|
|
END AS m_score_one_year,
|
|
|
|
CASE
|
|
WHEN (r_score_one_year IS NULL) AND (f_score_one_year IS NULL) AND (m_score_one_year IS NULL)
|
|
THEN '14_Not Active Between 1 year'
|
|
|
|
WHEN (r_score_one_year = 5) AND (f_score_one_year = 5) AND (m_score_one_year = 5)
|
|
THEN '1_King'
|
|
|
|
WHEN (r_score_one_year BETWEEN 2 AND 3) AND (f_score_one_year = 1) AND (m_score_one_year = 1)
|
|
THEN '10_At Cheap Risk'
|
|
|
|
WHEN (r_score_one_year = 1) AND (f_score_one_year = 1) AND (m_score_one_year = 1)
|
|
THEN '13_Cheap Lost'
|
|
|
|
WHEN (r_score_one_year BETWEEN 4 AND 5) AND (f_score_one_year BETWEEN 1 AND 2) AND (m_score_one_year BETWEEN 4 AND 5)
|
|
THEN '4_Whale'
|
|
|
|
WHEN (r_score_one_year BETWEEN 4 AND 5) AND (f_score_one_year BETWEEN 4 AND 5) AND (m_score_one_year BETWEEN 1 AND 2)
|
|
THEN '3_Sardine'
|
|
|
|
WHEN (r_score_one_year BETWEEN 4 AND 5) AND (f_score_one_year BETWEEN 3 AND 5) AND (m_score_one_year BETWEEN 3 AND 5)
|
|
THEN '2_Loyal Customer'
|
|
|
|
WHEN (r_score_one_year BETWEEN 4 AND 5) AND (f_score_one_year BETWEEN 2 AND 5) AND (m_score_one_year BETWEEN 2 AND 5)
|
|
THEN '5_Potention Loyal'
|
|
|
|
WHEN (r_score_one_year = 5) AND (f_score_one_year = 1) AND (m_score_one_year BETWEEN 1 AND 2)
|
|
THEN '7_New Customer'
|
|
|
|
WHEN (r_score_one_year BETWEEN 2 AND 3) AND (f_score_one_year BETWEEN 4 AND 5) AND (m_score_one_year BETWEEN 4 AND 5)
|
|
THEN '8_At High Risk'
|
|
|
|
WHEN (r_score_one_year BETWEEN 2 AND 3) AND (f_score_one_year BETWEEN 1 AND 5) AND (m_score_one_year BETWEEN 1 AND 5)
|
|
THEN '9_At Risk'
|
|
WHEN (r_score_one_year BETWEEN 2 AND 3) AND (f_score_one_year = 1) AND (m_score_one_year BETWEEN 1 AND 2)
|
|
THEN '9_At Risk'
|
|
WHEN (r_score_one_year BETWEEN 2 AND 3) AND (f_score_one_year BETWEEN 1 AND 2) AND (m_score_one_year = 1)
|
|
THEN '9_At Risk'
|
|
|
|
WHEN (r_score_one_year = 1) AND (f_score_one_year BETWEEN 4 AND 5) AND (m_score_one_year BETWEEN 1 AND 5)
|
|
THEN '11_Cant Lose Them'
|
|
WHEN (r_score_one_year = 1) AND (f_score_one_year BETWEEN 1 AND 5) AND (m_score_one_year BETWEEN 4 AND 5)
|
|
THEN '11_Cant Lose Them'
|
|
WHEN (r_score_one_year = 1) AND (f_score_one_year BETWEEN 3 AND 5) AND (m_score_one_year BETWEEN 3 AND 5)
|
|
THEN '11_Cant Lose Them'
|
|
|
|
WHEN (r_score_one_year = 1) AND (f_score_one_year BETWEEN 1 AND 3) AND (m_score_one_year BETWEEN 1 AND 3)
|
|
THEN '12_Lost'
|
|
|
|
WHEN (r_score_one_year BETWEEN 4 AND 5) AND (f_score_one_year = 1) AND (m_score_one_year BETWEEN 1 AND 3)
|
|
THEN '6_Normal Customer'
|
|
WHEN (r_score_one_year BETWEEN 4 AND 5) AND (f_score_one_year BETWEEN 1 AND 3) AND (m_score_one_year = 1)
|
|
THEN '6_Normal Customer'
|
|
|
|
ELSE 'ERROR Please Contact DATA Team'
|
|
END AS segment_one_year,
|
|
|
|
'{{ modules.datetime.datetime.now(modules.pytz.timezone("Asia/Kuala_Lumpur")) }}' AS _dbt_ran_datetime
|
|
|
|
FROM company_rfm
|
|
|
|
),
|
|
|
|
|
|
-- FINAL
|
|
final__rep_shipping__rfm AS (
|
|
|
|
SELECT
|
|
-- ids
|
|
sub_company_id,
|
|
sub_company_marking_id,
|
|
|
|
-- dimensions
|
|
segment_lifetime,
|
|
segment_one_year,
|
|
|
|
-- measures
|
|
day_after_last_packing_list_lifetime,
|
|
number_of_packing_list_lifetime,
|
|
total_package_cbm_lifetime,
|
|
r_score_lifetime,
|
|
f_score_lifetime,
|
|
m_score_lifetime,
|
|
day_after_last_packing_list_one_year,
|
|
number_of_packing_list_one_year,
|
|
total_package_cbm_one_year,
|
|
r_score_one_year,
|
|
f_score_one_year,
|
|
m_score_one_year,
|
|
|
|
-- date/times
|
|
last_packing_list_created_datetime,
|
|
|
|
-- metadata
|
|
_dbt_ran_datetime
|
|
|
|
FROM calculate_rfm
|
|
|
|
)
|
|
|
|
SELECT * FROM final__rep_shipping__rfm |