From a4c4fc83cb07154e2325e2471ca2aa2d5f7fdd12 Mon Sep 17 00:00:00 2001 From: CIEF ACC1 Date: Fri, 29 Dec 2023 09:42:53 +0000 Subject: [PATCH] Shipping data model - rfm --- models/marts/reporting/rep_shipping__rfm.sql | 303 +++++++++++++++++++ 1 file changed, 303 insertions(+) create mode 100644 models/marts/reporting/rep_shipping__rfm.sql diff --git a/models/marts/reporting/rep_shipping__rfm.sql b/models/marts/reporting/rep_shipping__rfm.sql new file mode 100644 index 0000000..95c29c6 --- /dev/null +++ b/models/marts/reporting/rep_shipping__rfm.sql @@ -0,0 +1,303 @@ +-- 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 \ No newline at end of file