mirror of
https://gitlab.com/cief-data/dbt_cloud.git
synced 2026-08-19 04:14:00 +00:00
Shipping data model - cohort analysis development
This commit is contained in:
@@ -0,0 +1,212 @@
|
|||||||
|
-- SOURCE: https://www.holistics.io/blog/calculate-cohort-retention-analysis-with-sql/
|
||||||
|
|
||||||
|
-- IMPORT
|
||||||
|
WITH companies AS (
|
||||||
|
SELECT * FROM {{ ref('dim_shipping__companies') }}
|
||||||
|
),
|
||||||
|
|
||||||
|
origin_warehouse_shipping_packing_lists AS (
|
||||||
|
SELECT * FROM {{ ref('fct_shipping__origin_warehouse_shipping_packing_lists') }}
|
||||||
|
),
|
||||||
|
|
||||||
|
|
||||||
|
-- LOGIC
|
||||||
|
company_register_month_year AS (
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
companies.sub_company_id,
|
||||||
|
companies.sub_company_marking_id,
|
||||||
|
companies.sub_company_created_datetime,
|
||||||
|
|
||||||
|
IFF(
|
||||||
|
MAX(origin_warehouse_shipping_packing_lists.origin_warehouse_shipping_order_created_datetime) IS NULL,
|
||||||
|
1,
|
||||||
|
0
|
||||||
|
) AS is_never_order_company,
|
||||||
|
|
||||||
|
DATE(DATE_TRUNC(
|
||||||
|
'MONTH',
|
||||||
|
companies.sub_company_created_datetime
|
||||||
|
)) AS register_month_year,
|
||||||
|
|
||||||
|
DATE(DATE_TRUNC(
|
||||||
|
'MONTH',
|
||||||
|
MIN(origin_warehouse_shipping_packing_lists.origin_warehouse_shipping_order_created_datetime)
|
||||||
|
)) AS first_order_month_year
|
||||||
|
|
||||||
|
FROM companies
|
||||||
|
|
||||||
|
LEFT JOIN origin_warehouse_shipping_packing_lists
|
||||||
|
ON (companies.sub_company_id = origin_warehouse_shipping_packing_lists.sub_company_id)
|
||||||
|
|
||||||
|
GROUP BY
|
||||||
|
companies.sub_company_id,
|
||||||
|
companies.sub_company_marking_id,
|
||||||
|
companies.sub_company_created_datetime,
|
||||||
|
register_month_year
|
||||||
|
|
||||||
|
),
|
||||||
|
|
||||||
|
company_order_count_from_registration_date AS (
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
origin_warehouse_shipping_packing_lists.sub_company_id,
|
||||||
|
|
||||||
|
DATEDIFF(
|
||||||
|
MONTH,
|
||||||
|
company_register_month_year.sub_company_created_datetime,
|
||||||
|
origin_warehouse_shipping_packing_lists.origin_warehouse_shipping_order_created_datetime
|
||||||
|
) AS order_month
|
||||||
|
|
||||||
|
FROM origin_warehouse_shipping_packing_lists
|
||||||
|
|
||||||
|
LEFT JOIN company_register_month_year
|
||||||
|
ON (origin_warehouse_shipping_packing_lists.sub_company_id = company_register_month_year.sub_company_id)
|
||||||
|
|
||||||
|
GROUP BY
|
||||||
|
origin_warehouse_shipping_packing_lists.sub_company_id,
|
||||||
|
order_month
|
||||||
|
|
||||||
|
),
|
||||||
|
|
||||||
|
company_first_order_from_registration_date AS (
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
origin_warehouse_shipping_packing_lists.sub_company_id,
|
||||||
|
DATE(DATE_TRUNC('MONTH', sub_company_created_datetime)) AS sub_company_created_datetime,
|
||||||
|
|
||||||
|
MIN(DATEDIFF(
|
||||||
|
MONTH,
|
||||||
|
company_register_month_year.sub_company_created_datetime,
|
||||||
|
origin_warehouse_shipping_packing_lists.origin_warehouse_shipping_order_created_datetime
|
||||||
|
)) AS first_order_month
|
||||||
|
|
||||||
|
FROM origin_warehouse_shipping_packing_lists
|
||||||
|
|
||||||
|
LEFT JOIN company_register_month_year
|
||||||
|
ON (origin_warehouse_shipping_packing_lists.sub_company_id = company_register_month_year.sub_company_id)
|
||||||
|
|
||||||
|
GROUP BY
|
||||||
|
origin_warehouse_shipping_packing_lists.sub_company_id,
|
||||||
|
sub_company_created_datetime
|
||||||
|
|
||||||
|
),
|
||||||
|
|
||||||
|
cohort_size_by_month_year AS (
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
register_month_year,
|
||||||
|
SUM(is_never_order_company) AS count_never_order_company,
|
||||||
|
COUNT(register_month_year) AS count_total_company
|
||||||
|
|
||||||
|
FROM company_register_month_year
|
||||||
|
|
||||||
|
GROUP BY register_month_year
|
||||||
|
|
||||||
|
ORDER BY register_month_year
|
||||||
|
|
||||||
|
),
|
||||||
|
|
||||||
|
order_retention AS (
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
company_register_month_year.register_month_year,
|
||||||
|
company_order_count_from_registration_date.order_month,
|
||||||
|
COUNT(company_register_month_year.register_month_year) AS count_retained_company
|
||||||
|
|
||||||
|
FROM company_order_count_from_registration_date
|
||||||
|
|
||||||
|
LEFT JOIN company_register_month_year
|
||||||
|
ON (company_order_count_from_registration_date.sub_company_id = company_register_month_year.sub_company_id)
|
||||||
|
|
||||||
|
GROUP BY
|
||||||
|
company_register_month_year.register_month_year,
|
||||||
|
company_order_count_from_registration_date.order_month
|
||||||
|
|
||||||
|
),
|
||||||
|
|
||||||
|
first_time_order_retention AS (
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
sub_company_created_datetime,
|
||||||
|
first_order_month,
|
||||||
|
COUNT(first_order_month) AS count_first_order_company
|
||||||
|
|
||||||
|
FROM company_first_order_from_registration_date
|
||||||
|
|
||||||
|
GROUP BY
|
||||||
|
sub_company_created_datetime,
|
||||||
|
first_order_month
|
||||||
|
|
||||||
|
),
|
||||||
|
|
||||||
|
cohort_analysis_table AS (
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
order_retention.register_month_year,
|
||||||
|
order_retention.order_month,
|
||||||
|
order_retention.count_retained_company AS retained_company,
|
||||||
|
|
||||||
|
cohort_size_by_month_year.count_total_company AS total_registered_company,
|
||||||
|
cohort_size_by_month_year.count_never_order_company,
|
||||||
|
|
||||||
|
first_time_order_retention.count_first_order_company AS count_first_order_company,
|
||||||
|
|
||||||
|
DIV0(
|
||||||
|
retained_company,
|
||||||
|
total_registered_company
|
||||||
|
) AS retention_rate_overall,
|
||||||
|
|
||||||
|
DIV0(
|
||||||
|
retained_company,
|
||||||
|
( total_registered_company - cohort_size_by_month_year.count_never_order_company )
|
||||||
|
) AS retention_rate_exclude_never_order_company,
|
||||||
|
|
||||||
|
DIV0(
|
||||||
|
count_first_order_company,
|
||||||
|
( total_registered_company - count_never_order_company )
|
||||||
|
) AS first_order_percentage,
|
||||||
|
|
||||||
|
'{{ modules.datetime.datetime.now(modules.pytz.timezone("Asia/Kuala_Lumpur")) }}' AS _dbt_ran_datetime
|
||||||
|
|
||||||
|
FROM order_retention
|
||||||
|
|
||||||
|
LEFT JOIN cohort_size_by_month_year
|
||||||
|
ON (order_retention.register_month_year = cohort_size_by_month_year.register_month_year)
|
||||||
|
|
||||||
|
LEFT JOIN first_time_order_retention
|
||||||
|
ON (order_retention.register_month_year = first_time_order_retention.sub_company_created_datetime)
|
||||||
|
AND (order_retention.order_month = first_time_order_retention.first_order_month)
|
||||||
|
|
||||||
|
ORDER BY
|
||||||
|
order_retention.register_month_year,
|
||||||
|
order_retention.order_month
|
||||||
|
|
||||||
|
),
|
||||||
|
|
||||||
|
|
||||||
|
-- FINAL
|
||||||
|
final_rep_shipping__cohort_analysis AS (
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
-- dimensions
|
||||||
|
register_month_year,
|
||||||
|
total_registered_company,
|
||||||
|
order_month,
|
||||||
|
|
||||||
|
-- measures
|
||||||
|
count_never_order_company,
|
||||||
|
count_first_order_company,
|
||||||
|
retained_company,
|
||||||
|
retention_rate_overall,
|
||||||
|
retention_rate_exclude_never_order_company,
|
||||||
|
first_order_percentage,
|
||||||
|
|
||||||
|
-- metadata
|
||||||
|
_dbt_ran_datetime
|
||||||
|
|
||||||
|
FROM cohort_analysis_table
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
SELECT * FROM final_rep_shipping__cohort_analysis
|
||||||
Reference in New Issue
Block a user