mirror of
https://gitlab.com/cief-data/dbt_cloud.git
synced 2026-08-25 23:34:06 +00:00
DBT structure change
This commit is contained in:
@@ -0,0 +1,394 @@
|
||||
-- MARCRO for count the cummulative_activity_number
|
||||
{% set funnel_activity = ['register','email_verified','identity_document_uploaded','identity_document_verified','first_time_booking','first_time_order','first_time_order_completed','repeat_completed_order_after_30days','repeat_completed_order_after_60days']%}
|
||||
|
||||
-- IMPORT
|
||||
WITH companies AS (
|
||||
SELECT * FROM {{ ref('dim_exchange__companies') }}
|
||||
),
|
||||
|
||||
transaction_orders AS (
|
||||
SELECT * FROM {{ ref('fct_exchange__transaction_orders') }}
|
||||
),
|
||||
|
||||
company_identity_documents AS (
|
||||
SELECT * FROM {{ ref('fct_exchange__company_identity_documents') }}
|
||||
),
|
||||
|
||||
email_verifications AS (
|
||||
SELECT * FROM {{ ref('fct_exchange__user_email_verifications') }}
|
||||
),
|
||||
|
||||
bookings AS (
|
||||
SELECT * FROM {{ ref('fct_exchange__bookings') }}
|
||||
),
|
||||
|
||||
|
||||
-- LOGIC
|
||||
remove_supplier_company AS (
|
||||
SELECT
|
||||
*
|
||||
FROM companies
|
||||
|
||||
WHERE business_type NOT IN ('CURRENCY_VENDOR', 'FREIGHT_FORWARDER')
|
||||
),
|
||||
|
||||
clean_company_transaction_orders AS (
|
||||
SELECT
|
||||
transaction_orders.*
|
||||
|
||||
FROM transaction_orders
|
||||
|
||||
-- Remove supplier (If any) 16/3/2023 Currently do not have any supplier in transaction orders
|
||||
INNER JOIN remove_supplier_company
|
||||
ON (transaction_orders.company_id = remove_supplier_company.company_id)
|
||||
),
|
||||
|
||||
clean_company_bookings AS (
|
||||
SELECT
|
||||
bookings.*
|
||||
|
||||
FROM bookings
|
||||
|
||||
-- Remove supplier (If any) 16/3/2023 Currently do not have any supplier in transaction orders
|
||||
INNER JOIN remove_supplier_company
|
||||
ON (bookings.company_id = remove_supplier_company.company_id)
|
||||
),
|
||||
|
||||
|
||||
company_first_time_order_date AS (
|
||||
SELECT
|
||||
transaction_order_id,
|
||||
company_id,
|
||||
order_created_datetime
|
||||
|
||||
FROM clean_company_transaction_orders
|
||||
|
||||
WHERE
|
||||
is_first_time_company_completed = '1'
|
||||
),
|
||||
|
||||
|
||||
|
||||
--start defind funnel activity
|
||||
repeat_completed_order_after_60days_activities AS (
|
||||
SELECT
|
||||
clean_company_transaction_orders.company_id,
|
||||
0 AS is_data_cleansing_generate_row,
|
||||
'repeat_completed_order_after_60days' AS activity,
|
||||
9 AS activtity_rank,
|
||||
MIN(clean_company_transaction_orders.order_created_datetime) AS activity_datetime
|
||||
|
||||
FROM clean_company_transaction_orders
|
||||
|
||||
LEFT JOIN company_first_time_order_date
|
||||
ON (clean_company_transaction_orders.company_id = company_first_time_order_date.company_id)
|
||||
|
||||
WHERE
|
||||
DATEDIFF(day, company_first_time_order_date.order_created_datetime, clean_company_transaction_orders.order_created_datetime) >= 60
|
||||
|
||||
GROUP BY
|
||||
clean_company_transaction_orders.company_id
|
||||
),
|
||||
|
||||
repeat_completed_order_after_30days_activities AS (
|
||||
SELECT
|
||||
clean_company_transaction_orders.company_id,
|
||||
0 AS is_data_cleansing_generate_row,
|
||||
'repeat_completed_order_after_30days' AS activity,
|
||||
8 AS activtity_rank,
|
||||
MIN(clean_company_transaction_orders.order_created_datetime) AS activity_datetime
|
||||
|
||||
FROM clean_company_transaction_orders
|
||||
|
||||
LEFT JOIN company_first_time_order_date
|
||||
ON (clean_company_transaction_orders.company_id = company_first_time_order_date.company_id)
|
||||
|
||||
WHERE
|
||||
DATEDIFF(day, company_first_time_order_date.order_created_datetime, clean_company_transaction_orders.order_created_datetime) >= 30
|
||||
|
||||
GROUP BY
|
||||
clean_company_transaction_orders.company_id
|
||||
),
|
||||
|
||||
first_time_order_completed_activities AS (
|
||||
SELECT
|
||||
clean_company_transaction_orders.company_id,
|
||||
0 AS is_data_cleansing_generate_row,
|
||||
'first_time_order_completed' AS activity,
|
||||
7 AS activtity_rank,
|
||||
MIN(clean_company_transaction_orders.order_created_datetime) AS activity_datetime
|
||||
|
||||
FROM clean_company_transaction_orders
|
||||
|
||||
WHERE
|
||||
clean_company_transaction_orders.is_first_time_company_completed = 1
|
||||
|
||||
GROUP BY
|
||||
clean_company_transaction_orders.company_id
|
||||
),
|
||||
|
||||
first_time_order_activities AS (
|
||||
SELECT
|
||||
clean_company_transaction_orders.company_id,
|
||||
0 AS is_data_cleansing_generate_row,
|
||||
'first_time_order' AS activity,
|
||||
6 AS activtity_rank,
|
||||
MIN(clean_company_transaction_orders.order_created_datetime) AS activity_datetime
|
||||
|
||||
FROM clean_company_transaction_orders
|
||||
|
||||
WHERE
|
||||
clean_company_transaction_orders.is_first_time_company = 1
|
||||
|
||||
GROUP BY
|
||||
clean_company_transaction_orders.company_id
|
||||
),
|
||||
|
||||
first_time_booking_activities AS (
|
||||
SELECT
|
||||
IFNULL( unclean_first_time_booking_activities.company_id , first_time_order_activities.company_id ) AS company_id,
|
||||
IFF( unclean_first_time_booking_activities.company_id IS NULL, 1, 0) AS is_data_cleansing_generate_row,
|
||||
'first_time_booking' AS activity,
|
||||
5 AS activtity_rank,
|
||||
IFNULL( unclean_first_time_booking_activities.activity_datetime , first_time_order_activities.activity_datetime ) AS activity_datetime
|
||||
|
||||
FROM
|
||||
(
|
||||
SELECT
|
||||
clean_company_bookings.company_id,
|
||||
'first_time_booking' AS activity,
|
||||
MIN(clean_company_bookings.booking_created_datetime) AS activity_datetime
|
||||
|
||||
FROM clean_company_bookings
|
||||
|
||||
WHERE
|
||||
clean_company_bookings.is_first_time_company = 1
|
||||
|
||||
GROUP BY
|
||||
clean_company_bookings.company_id
|
||||
) AS unclean_first_time_booking_activities
|
||||
|
||||
FULL OUTER JOIN first_time_order_activities
|
||||
ON (unclean_first_time_booking_activities.company_id = first_time_order_activities.company_id)
|
||||
),
|
||||
|
||||
|
||||
identity_document_verified_activities AS (
|
||||
SELECT
|
||||
IFNULL( unclean_identity_document_verified_activities.company_id , first_time_booking_activities.company_id ) AS company_id,
|
||||
IFF( unclean_identity_document_verified_activities.company_id IS NULL, 1, 0) AS is_data_cleansing_generate_row,
|
||||
'identity_document_verified' AS activity,
|
||||
4 AS activtity_rank,
|
||||
IFNULL( unclean_identity_document_verified_activities.activity_datetime , first_time_booking_activities.activity_datetime ) AS activity_datetime
|
||||
|
||||
FROM
|
||||
(
|
||||
|
||||
SELECT
|
||||
company_id,
|
||||
'identity_document_verified' AS activity,
|
||||
MIN(identity_created_datetime) AS activity_datetime
|
||||
|
||||
FROM company_identity_documents
|
||||
|
||||
WHERE
|
||||
identity_status = '2'
|
||||
|
||||
GROUP BY
|
||||
company_id
|
||||
|
||||
) AS unclean_identity_document_verified_activities
|
||||
|
||||
|
||||
FULL OUTER JOIN first_time_booking_activities
|
||||
ON (unclean_identity_document_verified_activities.company_id = first_time_booking_activities.company_id)
|
||||
|
||||
),
|
||||
|
||||
identity_document_uploaded_activities AS (
|
||||
SELECT
|
||||
IFNULL( unclean_identity_document_uploaded_activities.company_id , identity_document_verified_activities.company_id ) AS company_id,
|
||||
IFF( unclean_identity_document_uploaded_activities.company_id IS NULL, 1, 0) AS is_data_cleansing_generate_row,
|
||||
'identity_document_uploaded' AS activity,
|
||||
3 AS activtity_rank,
|
||||
IFNULL( unclean_identity_document_uploaded_activities.activity_datetime , identity_document_verified_activities.activity_datetime ) AS activity_datetime
|
||||
|
||||
FROM
|
||||
(
|
||||
|
||||
SELECT
|
||||
company_id,
|
||||
'identity_document_uploaded' AS activity,
|
||||
MIN(identity_created_datetime) AS activity_datetime
|
||||
|
||||
FROM company_identity_documents
|
||||
|
||||
GROUP BY
|
||||
company_id
|
||||
|
||||
) AS unclean_identity_document_uploaded_activities
|
||||
|
||||
|
||||
FULL OUTER JOIN identity_document_verified_activities
|
||||
ON (unclean_identity_document_uploaded_activities.company_id = identity_document_verified_activities.company_id)
|
||||
),
|
||||
|
||||
email_verified_activities AS (
|
||||
SELECT
|
||||
IFNULL( unclean_email_verified_activities.company_id , identity_document_uploaded_activities.company_id ) AS company_id,
|
||||
IFF( unclean_email_verified_activities.company_id IS NULL, 1, 0) AS is_data_cleansing_generate_row,
|
||||
'email_verified' AS activity,
|
||||
2 AS activtity_rank,
|
||||
IFNULL( unclean_email_verified_activities.activity_datetime , identity_document_uploaded_activities.activity_datetime ) AS activity_datetime
|
||||
|
||||
FROM
|
||||
(
|
||||
SELECT
|
||||
company_id,
|
||||
'email_verified' AS activity,
|
||||
MIN(user_email_verification_created_datetime) AS activity_datetime
|
||||
|
||||
FROM email_verifications
|
||||
|
||||
WHERE
|
||||
is_completed = '1'
|
||||
|
||||
GROUP BY
|
||||
company_id
|
||||
) AS unclean_email_verified_activities
|
||||
|
||||
FULL OUTER JOIN identity_document_uploaded_activities
|
||||
ON (unclean_email_verified_activities.company_id = identity_document_uploaded_activities.company_id)
|
||||
|
||||
),
|
||||
|
||||
register_activities AS (
|
||||
SELECT
|
||||
IFNULL( unclean_register_activities.company_id , email_verified_activities.company_id ) AS company_id,
|
||||
IFF( unclean_register_activities.company_id IS NULL, 1, 0) AS is_data_cleansing_generate_row,
|
||||
'register' AS activity,
|
||||
1 AS activtity_rank,
|
||||
IFNULL( unclean_register_activities.activity_datetime , email_verified_activities.activity_datetime ) AS activity_datetime
|
||||
|
||||
FROM
|
||||
(
|
||||
SELECT
|
||||
company_id,
|
||||
'register' AS activity,
|
||||
MIN(company_created_datetime) AS activity_datetime
|
||||
|
||||
FROM remove_supplier_company
|
||||
|
||||
GROUP BY
|
||||
company_id
|
||||
) AS unclean_register_activities
|
||||
|
||||
FULL OUTER JOIN email_verified_activities
|
||||
ON (unclean_register_activities.company_id = email_verified_activities.company_id)
|
||||
|
||||
),
|
||||
|
||||
|
||||
--all activites Union into a table
|
||||
union_all_activities AS (
|
||||
SELECT *
|
||||
FROM register_activities
|
||||
|
||||
{% for activity in funnel_activity[1:] %}
|
||||
|
||||
UNION
|
||||
SELECT *
|
||||
FROM {{activity}}_activities
|
||||
|
||||
{% endfor %}
|
||||
|
||||
),
|
||||
|
||||
union_all_activities_flag_migrated_company AS (
|
||||
SELECT
|
||||
union_all_activities.*,
|
||||
remove_supplier_company.is_migrated_company
|
||||
|
||||
FROM union_all_activities
|
||||
|
||||
LEFT JOIN remove_supplier_company
|
||||
ON (union_all_activities.company_id = remove_supplier_company.company_id)
|
||||
|
||||
),
|
||||
|
||||
get_number_of_conversions AS (
|
||||
SELECT
|
||||
company_id,
|
||||
is_data_cleansing_generate_row,
|
||||
is_migrated_company,
|
||||
activity,
|
||||
activtity_rank,
|
||||
IFF( ROW_NUMBER() OVER (PARTITION BY company_id ORDER BY activtity_rank DESC) = 1,
|
||||
1,
|
||||
0) AS is_company_latest_activity,
|
||||
|
||||
activity_datetime,
|
||||
|
||||
{% for activity_type in funnel_activity %}
|
||||
|
||||
count(iff(activity = '{{activity_type}}' AND is_migrated_company = 0, company_id, NULL))
|
||||
OVER (ORDER BY activity_datetime) AS cumulative_{{activity_type}}_activity,
|
||||
|
||||
{% endfor %}
|
||||
|
||||
{% for activity_type in funnel_activity %}
|
||||
|
||||
count(iff(activity = '{{activity_type}}', company_id, NULL))
|
||||
OVER (ORDER BY activity_datetime) AS include_migrated_cumulative_{{activity_type}}_activity,
|
||||
|
||||
{% endfor %}
|
||||
|
||||
'{{ modules.datetime.datetime.now(modules.pytz.timezone("Asia/Kuala_Lumpur")) }}' AS _dbt_ran_datetime
|
||||
|
||||
FROM union_all_activities_flag_migrated_company
|
||||
|
||||
ORDER BY activity_datetime
|
||||
),
|
||||
|
||||
-- FINAL
|
||||
final__rep_exchange__company_conversion_funnels AS (
|
||||
SELECT
|
||||
-- ids
|
||||
company_id,
|
||||
|
||||
-- dimensions
|
||||
activity,
|
||||
activtity_rank,
|
||||
is_company_latest_activity,
|
||||
is_data_cleansing_generate_row,
|
||||
is_migrated_company,
|
||||
|
||||
-- measures
|
||||
cumulative_register_activity,
|
||||
cumulative_email_verified_activity,
|
||||
cumulative_identity_document_uploaded_activity,
|
||||
cumulative_identity_document_verified_activity,
|
||||
cumulative_first_time_booking_activity,
|
||||
cumulative_first_time_order_activity,
|
||||
cumulative_first_time_order_completed_activity,
|
||||
cumulative_repeat_completed_order_after_30days_activity,
|
||||
cumulative_repeat_completed_order_after_60days_activity,
|
||||
include_migrated_cumulative_register_activity,
|
||||
include_migrated_cumulative_email_verified_activity,
|
||||
include_migrated_cumulative_identity_document_uploaded_activity,
|
||||
include_migrated_cumulative_first_time_booking_activity,
|
||||
include_migrated_cumulative_first_time_order_activity,
|
||||
include_migrated_cumulative_first_time_order_completed_activity,
|
||||
include_migrated_cumulative_repeat_completed_order_after_30days_activity,
|
||||
include_migrated_cumulative_repeat_completed_order_after_60days_activity,
|
||||
|
||||
-- date/times
|
||||
activity_datetime,
|
||||
|
||||
-- metadata
|
||||
_dbt_ran_datetime
|
||||
|
||||
FROM get_number_of_conversions
|
||||
)
|
||||
|
||||
SELECT * FROM final__rep_exchange__company_conversion_funnels
|
||||
@@ -0,0 +1,216 @@
|
||||
-- AVAILALE FILTER VALUE
|
||||
{% set day_use_to_churn = 61 %}
|
||||
|
||||
-- IMPORT
|
||||
WITH companies AS (
|
||||
SELECT * FROM {{ ref('dim_exchange__companies') }}
|
||||
),
|
||||
|
||||
transaction_orders AS (
|
||||
SELECT * FROM {{ ref('fct_exchange__transaction_orders') }}
|
||||
),
|
||||
|
||||
|
||||
-- LOGIC
|
||||
remove_supplier_company AS (
|
||||
SELECT
|
||||
*
|
||||
FROM companies
|
||||
|
||||
WHERE business_type = 'IMPORTER'
|
||||
),
|
||||
|
||||
|
||||
order_date_row_rank AS (
|
||||
SELECT
|
||||
*,
|
||||
row_number() OVER
|
||||
(PARTITION BY transaction_orders.company_id
|
||||
ORDER BY transaction_orders.order_created_datetime) AS row_rank_index
|
||||
|
||||
FROM
|
||||
transaction_orders
|
||||
),
|
||||
|
||||
get_next_and_previous_order_date_orders AS (
|
||||
SELECT
|
||||
order_date_row_rank.*,
|
||||
companies.is_migrated_company,
|
||||
next_order_date_row_rank_clone.order_created_datetime AS next_order_created_datetime,
|
||||
previous_order_date_row_rank_clone.order_created_datetime AS previous_order_created_datetime,
|
||||
companies.company_marking_id,
|
||||
companies.company_created_datetime
|
||||
|
||||
FROM order_date_row_rank
|
||||
|
||||
LEFT JOIN companies
|
||||
ON (order_date_row_rank.company_id = companies.company_id)
|
||||
|
||||
LEFT JOIN order_date_row_rank AS next_order_date_row_rank_clone
|
||||
ON order_date_row_rank.row_rank_index = next_order_date_row_rank_clone.row_rank_index - 1
|
||||
AND order_date_row_rank.company_id = next_order_date_row_rank_clone.company_id
|
||||
|
||||
LEFT JOIN order_date_row_rank AS previous_order_date_row_rank_clone
|
||||
ON order_date_row_rank.row_rank_index = previous_order_date_row_rank_clone.row_rank_index + 1
|
||||
AND order_date_row_rank.company_id = previous_order_date_row_rank_clone.company_id
|
||||
),
|
||||
|
||||
-- Register / Churn / Register; Churn
|
||||
company_register_events AS (
|
||||
SELECT
|
||||
remove_supplier_company.company_id AS company_id,
|
||||
remove_supplier_company.is_migrated_company,
|
||||
IFF(MAX(transaction_orders.company_id) IS NULL, 1, 0) AS is_never_order_company,
|
||||
remove_supplier_company.company_marking_id,
|
||||
'Register' AS register_event,
|
||||
IFF(
|
||||
DATEDIFF(
|
||||
day,
|
||||
remove_supplier_company.company_created_datetime,
|
||||
COALESCE(MIN(transaction_orders.order_created_datetime), CURRENT_DATE())
|
||||
)
|
||||
>= {{day_use_to_churn}},
|
||||
'Churn',
|
||||
NULL) AS churn_event,
|
||||
|
||||
RTRIM(CONCAT(
|
||||
CASE WHEN register_event IS NOT NULL THEN 'Register, ' ELSE '' END,
|
||||
CASE WHEN churn_event IS NOT NULL THEN 'Churn, ' ELSE '' END ),', ' ) AS concat_event,
|
||||
|
||||
remove_supplier_company.company_created_datetime AS event_datetime
|
||||
|
||||
FROM remove_supplier_company
|
||||
|
||||
LEFT JOIN transaction_orders
|
||||
ON (remove_supplier_company.company_id = transaction_orders.company_id)
|
||||
|
||||
GROUP BY
|
||||
remove_supplier_company.company_id,
|
||||
remove_supplier_company.company_marking_id,
|
||||
remove_supplier_company.is_migrated_company,
|
||||
remove_supplier_company.company_created_datetime
|
||||
),
|
||||
|
||||
|
||||
-- FirstTimeOrder / Repeat / Churn / Reactive
|
||||
firsttime_repeat_churn_reactive_order_events AS (
|
||||
SELECT
|
||||
company_id,
|
||||
company_marking_id,
|
||||
is_migrated_company,
|
||||
0 AS is_never_order_company,
|
||||
transaction_order_id,
|
||||
order_status,
|
||||
payment_method,
|
||||
base_currency_id,
|
||||
quote_currency_id,
|
||||
base_to_quote_currency_exchange_rate,
|
||||
value_rm,
|
||||
tax_rm,
|
||||
service_charge_rm,
|
||||
IFF(is_first_time_company = 1, 'First Time Order', NULL) AS first_time_order_event,
|
||||
IFF(is_first_time_company = 0, 'Repeat', NULL) AS repeat_event,
|
||||
IFF(DATEDIFF(day, order_created_datetime, COALESCE(next_order_created_datetime, CURRENT_DATE())) >= {{day_use_to_churn}}, 'Churn', NULL ) AS churn_event,
|
||||
IFF(DATEDIFF(day, COALESCE(previous_order_created_datetime, company_created_datetime), order_created_datetime) >= {{day_use_to_churn}}, 'Reactive', NULL) AS reactive_event,
|
||||
|
||||
RTRIM(CONCAT(
|
||||
CASE WHEN first_time_order_event IS NOT NULL THEN 'First Time Order, ' ELSE '' END,
|
||||
CASE WHEN repeat_event IS NOT NULL THEN 'Repeat, ' ELSE '' END,
|
||||
CASE WHEN reactive_event IS NOT NULL THEN 'Reactive, ' ELSE '' END,
|
||||
CASE WHEN churn_event IS NOT NULL THEN 'Churn, ' ELSE '' END ),', ' ) AS concat_event,
|
||||
|
||||
order_created_datetime AS event_datetime
|
||||
|
||||
FROM get_next_and_previous_order_date_orders
|
||||
),
|
||||
|
||||
union_event_tables AS (
|
||||
SELECT
|
||||
company_id,
|
||||
company_marking_id,
|
||||
is_migrated_company,
|
||||
is_never_order_company,
|
||||
NULL AS transaction_order_id,
|
||||
NULL AS order_status,
|
||||
NULL AS payment_method,
|
||||
NULL AS base_currency_id,
|
||||
NULL AS quote_currency_id,
|
||||
NULL AS base_to_quote_currency_exchange_rate,
|
||||
NULL AS value_rm,
|
||||
NULL AS tax_rm,
|
||||
NULL AS service_charge_rm,
|
||||
register_event,
|
||||
NULL AS first_time_order_event,
|
||||
NULL AS repeat_event,
|
||||
churn_event,
|
||||
NULL AS reactive_event,
|
||||
concat_event,
|
||||
event_datetime
|
||||
|
||||
FROM company_register_events
|
||||
|
||||
UNION
|
||||
|
||||
SELECT
|
||||
company_id,
|
||||
company_marking_id,
|
||||
is_migrated_company,
|
||||
is_never_order_company,
|
||||
transaction_order_id,
|
||||
order_status,
|
||||
payment_method,
|
||||
base_currency_id,
|
||||
quote_currency_id,
|
||||
base_to_quote_currency_exchange_rate,
|
||||
value_rm,
|
||||
tax_rm,
|
||||
service_charge_rm,
|
||||
NULL AS register_event,
|
||||
first_time_order_event,
|
||||
repeat_event,
|
||||
churn_event,
|
||||
reactive_event,
|
||||
concat_event,
|
||||
event_datetime
|
||||
|
||||
FROM firsttime_repeat_churn_reactive_order_events
|
||||
),
|
||||
|
||||
-- FINAL
|
||||
final__rep_exchange__company_engagement_behaviors AS (
|
||||
SELECT
|
||||
-- ids
|
||||
company_id,
|
||||
company_marking_id,
|
||||
transaction_order_id,
|
||||
base_currency_id,
|
||||
quote_currency_id,
|
||||
|
||||
-- dimensions
|
||||
is_migrated_company,
|
||||
is_never_order_company,
|
||||
order_status,
|
||||
payment_method,
|
||||
register_event,
|
||||
first_time_order_event,
|
||||
repeat_event,
|
||||
churn_event,
|
||||
reactive_event,
|
||||
concat_event,
|
||||
|
||||
-- measures
|
||||
base_to_quote_currency_exchange_rate,
|
||||
value_rm,
|
||||
tax_rm,
|
||||
service_charge_rm,
|
||||
|
||||
-- date/times
|
||||
event_datetime,
|
||||
|
||||
-- metadata
|
||||
'{{ modules.datetime.datetime.now(modules.pytz.timezone("Asia/Kuala_Lumpur")) }}' AS _dbt_ran_datetime
|
||||
|
||||
FROM union_event_tables
|
||||
)
|
||||
|
||||
SELECT * FROM final__rep_exchange__company_engagement_behaviors
|
||||
@@ -0,0 +1,78 @@
|
||||
-- AVAILALE FILTER VALUE
|
||||
-- Source:preset_custom_filter Column:day_use_to_churn
|
||||
{% set day_use_to_churn = 61 %}
|
||||
|
||||
-- IMPORT
|
||||
WITH companies AS (
|
||||
SELECT * FROM {{ ref('dim_exchange__companies') }}
|
||||
),
|
||||
|
||||
transaction_orders AS (
|
||||
SELECT * FROM {{ ref('fct_exchange__transaction_orders') }}
|
||||
),
|
||||
|
||||
-- LOGIC
|
||||
|
||||
company_agg AS (
|
||||
|
||||
SELECT
|
||||
companies.company_id,
|
||||
companies.is_migrated_company,
|
||||
companies.company_marking_id,
|
||||
companies.company_created_datetime,
|
||||
COUNT(transaction_orders.transaction_order_id) AS count_order,
|
||||
COUNT(IFF(transaction_orders.order_status = 'completed', transaction_orders.transaction_order_id, null)) AS count_completed_order,
|
||||
MAX(transaction_orders.order_created_datetime) AS last_order_datetime,
|
||||
COALESCE(last_order_datetime, company_created_datetime) AS last_activity_datetime,
|
||||
IFF(companies.company_created_datetime < '2021-07-01', 1, 0) AS is_wrong_created_datetime_company,
|
||||
IFF(MAX(transaction_orders.order_created_datetime) IS NULL, 1, 0) AS is_never_order_company,
|
||||
IFF(DATEDIFF(day, last_activity_datetime, CURRENT_DATE()) >= {{day_use_to_churn}}, 1, 0 ) AS is_churn_company,
|
||||
IFF( is_churn_company = 1, DATEDIFF(day, company_created_datetime, last_activity_datetime) + {{day_use_to_churn}}, NULL) AS create_to_churn_day,
|
||||
|
||||
'{{ modules.datetime.datetime.now(modules.pytz.timezone("Asia/Kuala_Lumpur")) }}' AS _dbt_ran_datetime
|
||||
|
||||
FROM
|
||||
companies
|
||||
|
||||
LEFT JOIN transaction_orders
|
||||
ON (companies.company_id = transaction_orders.company_id)
|
||||
|
||||
GROUP BY
|
||||
companies.company_id,
|
||||
companies.is_migrated_company,
|
||||
companies.company_marking_id,
|
||||
companies.company_created_datetime
|
||||
),
|
||||
|
||||
-- FINAL
|
||||
final__rep_exchange__company_lists AS (
|
||||
SELECT
|
||||
-- ids
|
||||
company_id,
|
||||
company_marking_id,
|
||||
|
||||
-- dimensions
|
||||
is_migrated_company,
|
||||
is_wrong_created_datetime_company,
|
||||
is_never_order_company,
|
||||
is_churn_company,
|
||||
|
||||
-- measures
|
||||
count_order,
|
||||
count_completed_order,
|
||||
create_to_churn_day,
|
||||
|
||||
|
||||
-- date/times
|
||||
company_created_datetime,
|
||||
last_order_datetime,
|
||||
last_activity_datetime,
|
||||
|
||||
-- metadata
|
||||
_dbt_ran_datetime
|
||||
|
||||
FROM company_agg
|
||||
)
|
||||
|
||||
|
||||
SELECT * FROM final__rep_exchange__company_lists
|
||||
@@ -0,0 +1,257 @@
|
||||
-- IMPORT
|
||||
WITH transaction_orders AS (
|
||||
SELECT * FROM {{ ref('fct_exchange__transaction_orders') }}
|
||||
),
|
||||
|
||||
bookings AS (
|
||||
SELECT * FROM {{ ref('fct_exchange__bookings') }}
|
||||
),
|
||||
|
||||
transaction_costs AS (
|
||||
SELECT * FROM {{ ref('fct_exchange__transaction_costs') }}
|
||||
),
|
||||
|
||||
companies AS (
|
||||
SELECT * FROM {{ ref('dim_exchange__companies') }}
|
||||
),
|
||||
|
||||
currencies AS (
|
||||
SELECT * FROM {{ ref('dim_exchange__currencies') }}
|
||||
),
|
||||
|
||||
dates AS (
|
||||
SELECT * FROM {{ ref('dim__dates') }}
|
||||
),
|
||||
|
||||
|
||||
--LOGIC
|
||||
transaction_orders_get_next_order_created_datetime AS (
|
||||
SELECT
|
||||
*,
|
||||
LEAD(order_created_datetime) OVER (PARTITION BY company_id ORDER BY order_created_datetime) AS next_order_created_datetime
|
||||
|
||||
FROM
|
||||
transaction_orders
|
||||
),
|
||||
|
||||
fct_and_dim_joins AS (
|
||||
SELECT
|
||||
bookings.booking_id,
|
||||
bookings.booking_marking_id,
|
||||
bookings.company_id,
|
||||
|
||||
companies.company_marking_id AS company_marking_id,
|
||||
companies.autocount_id AS company_autocount_id,
|
||||
companies.company_type AS company_type,
|
||||
companies.business_type AS company_business_type,
|
||||
companies.exchange_rate_segment AS company_exchange_rate_segment,
|
||||
companies.is_migrated_company AS is_migrated_company,
|
||||
companies.country_name AS company_country_name,
|
||||
companies.state_name AS company_state_name,
|
||||
companies.district_name AS company_district_name,
|
||||
companies.postcode AS company_postcode,
|
||||
companies.has_wallet AS company_has_wallet,
|
||||
|
||||
bookings.user_id,
|
||||
bookings.bank_id,
|
||||
|
||||
fix_currencies.currency_name AS fix_currency_name,
|
||||
|
||||
quote_currencies.currency_name AS quote_currency_name,
|
||||
|
||||
base_currencies.currency_name AS base_currency_name,
|
||||
|
||||
bookings.service_type,
|
||||
bookings.status AS booking_status,
|
||||
bookings.is_first_time_company AS is_first_time_booking_company,
|
||||
bookings.is_first_time_company_completed AS is_first_time_booking_company_completed,
|
||||
bookings.is_first_time_user AS is_first_time_booking_user,
|
||||
bookings.is_first_time_user_completed AS is_first_time_booking_user_completed,
|
||||
bookings.estimate_base_to_quote_currency_exchange_rate AS estimate_booking_base_to_quote_currency_exchange_rate,
|
||||
bookings.estimate_quote_value AS estimate_booking_quote_value,
|
||||
bookings.estimate_base_value AS estimate_booking_base_value,
|
||||
bookings.estimate_value_rm AS estimate_booking_value_rm,
|
||||
bookings.booking_created_datetime,
|
||||
bookings.booking_approved_datetime,
|
||||
bookings.booking_completed_datetime,
|
||||
bookings.booking_suspended_datetime,
|
||||
|
||||
transaction_orders_get_next_order_created_datetime.transaction_order_id AS order_id,
|
||||
transaction_orders_get_next_order_created_datetime.payment_method AS order_payment_method,
|
||||
transaction_orders_get_next_order_created_datetime.order_status,
|
||||
transaction_orders_get_next_order_created_datetime.payment_reference AS order_payment_reference,
|
||||
transaction_orders_get_next_order_created_datetime.bill_number AS order_bill_number,
|
||||
transaction_orders_get_next_order_created_datetime.is_first_time_company AS is_first_time_order_company,
|
||||
transaction_orders_get_next_order_created_datetime.is_first_time_company_completed AS is_first_time_order_company_completed,
|
||||
transaction_orders_get_next_order_created_datetime.is_first_time_user AS is_first_time_order_user,
|
||||
transaction_orders_get_next_order_created_datetime.is_first_time_user_completed AS is_first_time_order_user_completed,
|
||||
transaction_orders_get_next_order_created_datetime.base_to_quote_currency_exchange_rate AS order_base_to_quote_currency_exchange_rate ,
|
||||
transaction_orders_get_next_order_created_datetime.base_value AS order_base_value ,
|
||||
transaction_orders_get_next_order_created_datetime.base_service_charge AS order_base_service_charge ,
|
||||
transaction_orders_get_next_order_created_datetime.base_tax AS order_base_tax ,
|
||||
transaction_orders_get_next_order_created_datetime.quote_value AS order_quote_value ,
|
||||
transaction_orders_get_next_order_created_datetime.value_rm AS order_value_rm ,
|
||||
transaction_orders_get_next_order_created_datetime.service_charge_rm AS order_service_charge_rm ,
|
||||
transaction_orders_get_next_order_created_datetime.tax_rm AS order_tax_rm ,
|
||||
transaction_orders_get_next_order_created_datetime.total_value_rm AS total_order_value_rm,
|
||||
|
||||
transaction_orders_get_next_order_created_datetime.order_created_datetime,
|
||||
order_created_dates.first_day_of_week AS order_created_week,
|
||||
|
||||
transaction_orders_get_next_order_created_datetime.order_pending_submission_datetime,
|
||||
transaction_orders_get_next_order_created_datetime.order_pending_verification_datetime,
|
||||
transaction_orders_get_next_order_created_datetime.order_approved_datetime,
|
||||
transaction_orders_get_next_order_created_datetime.order_completed_datetime,
|
||||
transaction_orders_get_next_order_created_datetime.order_rejected_datetime,
|
||||
transaction_orders_get_next_order_created_datetime.order_suspended_datetime,
|
||||
transaction_orders_get_next_order_created_datetime.next_order_created_datetime,
|
||||
|
||||
transaction_costs.transaction_cost_id AS cost_id,
|
||||
transaction_costs.bank_id AS currency_vendor_bank_id,
|
||||
transaction_costs.transaction_type AS cost_transaction_type,
|
||||
transaction_costs.payment_method AS cost_payment_method,
|
||||
transaction_costs.status AS cost_status,
|
||||
transaction_costs.payment_reference AS cost_payment_reference,
|
||||
transaction_costs.bill_number AS cost_bill_number,
|
||||
transaction_costs.base_value AS cost_base_value,
|
||||
transaction_costs.quote_value AS cost_quote_value,
|
||||
transaction_costs.base_to_quote_currency_exchange_rate AS cost_base_to_quote_currency_exchange_rate,
|
||||
transaction_costs.base_tax AS cost_base_tax,
|
||||
transaction_costs.base_service_charge AS cost_base_service_charge,
|
||||
transaction_costs.value_rm AS cost_value_rm,
|
||||
transaction_costs.tax_rm AS cost_tax_rm,
|
||||
transaction_costs.service_charge_rm AS cost_service_charge_rm,
|
||||
transaction_costs.total_value_rm AS total_cost_value_rm,
|
||||
transaction_costs.cost_created_datetime,
|
||||
transaction_costs.cost_pending_submission_datetime,
|
||||
transaction_costs.cost_pending_verification_datetime,
|
||||
transaction_costs.cost_approved_datetime,
|
||||
transaction_costs.cost_completed_datetime,
|
||||
transaction_costs.cost_rejected_datetime,
|
||||
|
||||
'{{ modules.datetime.datetime.now(modules.pytz.timezone("Asia/Kuala_Lumpur")) }}' AS _dbt_ran_datetime
|
||||
|
||||
FROM bookings
|
||||
|
||||
LEFT JOIN transaction_orders_get_next_order_created_datetime
|
||||
ON (bookings.booking_id = transaction_orders_get_next_order_created_datetime.booking_id)
|
||||
|
||||
LEFT JOIN transaction_costs
|
||||
ON (transaction_orders_get_next_order_created_datetime.transaction_order_id = transaction_costs.transaction_order_id)
|
||||
|
||||
LEFT JOIN companies
|
||||
ON (bookings.company_id = companies.company_id)
|
||||
|
||||
LEFT JOIN dates AS order_created_dates
|
||||
ON (transaction_orders_get_next_order_created_datetime.order_created_datetime = order_created_dates.date_day)
|
||||
|
||||
LEFT JOIN currencies AS fix_currencies
|
||||
ON (bookings.fix_currency_id = fix_currencies.currency_id)
|
||||
|
||||
LEFT JOIN currencies AS quote_currencies
|
||||
ON (bookings.quote_currency_id = quote_currencies.currency_id)
|
||||
|
||||
LEFT JOIN currencies AS base_currencies
|
||||
ON (bookings.base_currency_id = base_currencies.currency_id)
|
||||
),
|
||||
|
||||
--FINAL
|
||||
final__rep_exchange__daily_orders AS (
|
||||
SELECT
|
||||
-- ids
|
||||
order_id,
|
||||
bank_id,
|
||||
company_id,
|
||||
company_marking_id,
|
||||
company_autocount_id,
|
||||
user_id,
|
||||
cost_id,
|
||||
currency_vendor_bank_id,
|
||||
booking_id,
|
||||
booking_marking_id,
|
||||
|
||||
-- dimensions
|
||||
fix_currency_name,
|
||||
quote_currency_name,
|
||||
base_currency_name,
|
||||
service_type,
|
||||
order_payment_method,
|
||||
order_status,
|
||||
order_payment_reference,
|
||||
order_bill_number,
|
||||
is_first_time_order_company,
|
||||
is_first_time_order_company_completed,
|
||||
is_first_time_order_user,
|
||||
is_first_time_order_user_completed,
|
||||
company_exchange_rate_segment,
|
||||
company_type,
|
||||
company_business_type,
|
||||
is_migrated_company,
|
||||
company_country_name,
|
||||
company_state_name,
|
||||
company_district_name,
|
||||
company_postcode,
|
||||
company_has_wallet,
|
||||
cost_transaction_type,
|
||||
cost_payment_method,
|
||||
cost_status,
|
||||
cost_payment_reference,
|
||||
cost_bill_number,
|
||||
booking_status,
|
||||
is_first_time_booking_company,
|
||||
is_first_time_booking_company_completed,
|
||||
is_first_time_booking_user,
|
||||
is_first_time_booking_user_completed,
|
||||
|
||||
-- measures
|
||||
order_base_to_quote_currency_exchange_rate,
|
||||
order_base_value,
|
||||
order_base_service_charge,
|
||||
order_base_tax,
|
||||
order_quote_value,
|
||||
order_value_rm,
|
||||
order_service_charge_rm,
|
||||
order_tax_rm,
|
||||
total_order_value_rm,
|
||||
cost_base_value,
|
||||
cost_quote_value,
|
||||
cost_base_to_quote_currency_exchange_rate,
|
||||
cost_base_tax,
|
||||
cost_base_service_charge,
|
||||
cost_value_rm,
|
||||
cost_tax_rm,
|
||||
cost_service_charge_rm,
|
||||
total_cost_value_rm,
|
||||
estimate_booking_base_to_quote_currency_exchange_rate,
|
||||
estimate_booking_quote_value,
|
||||
estimate_booking_base_value,
|
||||
estimate_booking_value_rm,
|
||||
|
||||
-- date/times
|
||||
order_created_datetime,
|
||||
order_created_week,
|
||||
order_pending_submission_datetime,
|
||||
order_pending_verification_datetime,
|
||||
order_approved_datetime,
|
||||
order_completed_datetime,
|
||||
order_rejected_datetime,
|
||||
order_suspended_datetime,
|
||||
next_order_created_datetime,
|
||||
cost_created_datetime,
|
||||
cost_pending_submission_datetime,
|
||||
cost_pending_verification_datetime,
|
||||
cost_approved_datetime,
|
||||
cost_completed_datetime,
|
||||
cost_rejected_datetime,
|
||||
booking_created_datetime,
|
||||
booking_approved_datetime,
|
||||
booking_completed_datetime,
|
||||
booking_suspended_datetime,
|
||||
|
||||
-- metadata
|
||||
_dbt_ran_datetime
|
||||
|
||||
FROM fct_and_dim_joins
|
||||
)
|
||||
|
||||
SELECT * FROM final__rep_exchange__daily_orders
|
||||
@@ -0,0 +1,290 @@
|
||||
-- AVAILALE FILTER VALUE
|
||||
{% 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() %}
|
||||
|
||||
{% set recency_list_lifetime = [60,120,180,240] %}
|
||||
{% set frequency_list_lifetime = [1,3,9,27] %}
|
||||
{% set monetary_list_lifetime = [2000,7000,25000,82000] %}
|
||||
|
||||
{% set recency_list_one_year = [60,120,180,240] %}
|
||||
{% set frequency_list_one_year = [1,2,6,21] %}
|
||||
{% set monetary_list_one_year = [2000,7000,25000,77000] %}
|
||||
|
||||
-- IMPORT
|
||||
WITH transaction_orders AS (
|
||||
SELECT * FROM {{ ref('fct_exchange__transaction_orders') }}
|
||||
),
|
||||
|
||||
|
||||
companies AS (
|
||||
SELECT * FROM {{ ref('dim_exchange__companies') }}
|
||||
),
|
||||
|
||||
|
||||
-- LOGIC
|
||||
transaction_order_one_years AS (
|
||||
SELECT
|
||||
company_id,
|
||||
MAX(transaction_orders.order_created_datetime) AS last_approved_or_completed_order_created_datetime_one_year,
|
||||
DATEDIFF(day, last_approved_or_completed_order_created_datetime_one_year, CURRENT_DATE() ) AS day_after_approved_or_completed_order_one_year,
|
||||
COUNT(transaction_orders.transaction_order_id) AS number_of_approved_or_completed_order_one_year,
|
||||
ROUND(SUM(transaction_orders.value_rm + transaction_orders.tax_rm + transaction_orders.service_charge_rm),2) AS total_value_of_approved_or_completed_order_one_year
|
||||
|
||||
FROM
|
||||
transaction_orders
|
||||
|
||||
WHERE
|
||||
order_status IN ('APPROVED','COMPLETED')
|
||||
AND
|
||||
order_created_datetime >= '{{ custom_one_year_from_date }}'
|
||||
AND
|
||||
order_created_datetime < '{{ custom_one_year_to_date }}'
|
||||
|
||||
GROUP BY
|
||||
company_id
|
||||
),
|
||||
|
||||
company_rfm AS (
|
||||
SELECT
|
||||
transaction_orders.company_id,
|
||||
companies.company_marking_id AS company_marking_id,
|
||||
MAX(transaction_orders.order_created_datetime) AS last_approved_or_completed_order_created_datetime,
|
||||
|
||||
DATEDIFF(day, last_approved_or_completed_order_created_datetime, CURRENT_DATE() ) AS day_after_approved_or_completed_order_lifetime,
|
||||
MAX(transaction_order_one_years.day_after_approved_or_completed_order_one_year) AS day_after_approved_or_completed_order_one_year,
|
||||
|
||||
COUNT(transaction_orders.transaction_order_id) AS number_of_approved_or_completed_order_lifetime,
|
||||
MAX(transaction_order_one_years.number_of_approved_or_completed_order_one_year) AS number_of_approved_or_completed_order_one_year,
|
||||
|
||||
ROUND(SUM(transaction_orders.value_rm + transaction_orders.tax_rm + transaction_orders.service_charge_rm),2) AS total_value_of_approved_or_completed_order_lifetime,
|
||||
MAX(transaction_order_one_years.total_value_of_approved_or_completed_order_one_year) AS total_value_of_approved_or_completed_order_one_year
|
||||
|
||||
FROM transaction_orders
|
||||
|
||||
LEFT JOIN transaction_order_one_years
|
||||
ON (transaction_orders.company_id = transaction_order_one_years.company_id)
|
||||
|
||||
LEFT JOIN companies
|
||||
ON (transaction_orders.company_id = companies.company_id)
|
||||
|
||||
|
||||
WHERE
|
||||
transaction_orders.order_status IN ('APPROVED','COMPLETED')
|
||||
|
||||
GROUP BY
|
||||
transaction_orders.company_id,
|
||||
companies.company_marking_id
|
||||
),
|
||||
|
||||
calculate_rfm AS (
|
||||
SELECT
|
||||
*,
|
||||
|
||||
|
||||
CASE
|
||||
WHEN day_after_approved_or_completed_order_lifetime <= {{recency_list_lifetime[0]}} THEN 5
|
||||
WHEN (day_after_approved_or_completed_order_lifetime > {{recency_list_lifetime[0]}} AND day_after_approved_or_completed_order_lifetime <= {{recency_list_lifetime[1]}}) THEN 4
|
||||
WHEN (day_after_approved_or_completed_order_lifetime > {{recency_list_lifetime[1]}} AND day_after_approved_or_completed_order_lifetime <= {{recency_list_lifetime[2]}}) THEN 3
|
||||
WHEN (day_after_approved_or_completed_order_lifetime > {{recency_list_lifetime[2]}} AND day_after_approved_or_completed_order_lifetime <= {{recency_list_lifetime[3]}}) THEN 2
|
||||
WHEN day_after_approved_or_completed_order_lifetime > {{recency_list_lifetime[3]}} THEN 1
|
||||
ELSE -999
|
||||
END AS r_score_lifetime,
|
||||
CASE
|
||||
WHEN number_of_approved_or_completed_order_lifetime <= {{frequency_list_lifetime[0]}} THEN 1
|
||||
WHEN (number_of_approved_or_completed_order_lifetime > {{frequency_list_lifetime[0]}} AND number_of_approved_or_completed_order_lifetime <= {{frequency_list_lifetime[1]}}) THEN 2
|
||||
WHEN (number_of_approved_or_completed_order_lifetime > {{frequency_list_lifetime[1]}} AND number_of_approved_or_completed_order_lifetime <= {{frequency_list_lifetime[2]}}) THEN 3
|
||||
WHEN (number_of_approved_or_completed_order_lifetime > {{frequency_list_lifetime[2]}} AND number_of_approved_or_completed_order_lifetime <= {{frequency_list_lifetime[3]}}) THEN 4
|
||||
WHEN number_of_approved_or_completed_order_lifetime > {{frequency_list_lifetime[3]}} THEN 5
|
||||
ELSE -999
|
||||
END AS f_score_lifetime,
|
||||
CASE
|
||||
WHEN total_value_of_approved_or_completed_order_lifetime <= {{monetary_list_lifetime[0]}} THEN 1
|
||||
WHEN (total_value_of_approved_or_completed_order_lifetime > {{monetary_list_lifetime[0]}} AND total_value_of_approved_or_completed_order_lifetime <= {{monetary_list_lifetime[1]}}) THEN 2
|
||||
WHEN (total_value_of_approved_or_completed_order_lifetime > {{monetary_list_lifetime[1]}} AND total_value_of_approved_or_completed_order_lifetime <= {{monetary_list_lifetime[2]}}) THEN 3
|
||||
WHEN (total_value_of_approved_or_completed_order_lifetime > {{monetary_list_lifetime[2]}} AND total_value_of_approved_or_completed_order_lifetime <= {{monetary_list_lifetime[3]}}) THEN 4
|
||||
WHEN total_value_of_approved_or_completed_order_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_approved_or_completed_order_one_year IS NULL THEN NULL
|
||||
WHEN day_after_approved_or_completed_order_one_year <= {{recency_list_one_year[0]}} THEN 5
|
||||
WHEN (day_after_approved_or_completed_order_one_year > {{recency_list_one_year[0]}} AND day_after_approved_or_completed_order_one_year <= {{recency_list_one_year[1]}}) THEN 4
|
||||
WHEN (day_after_approved_or_completed_order_one_year > {{recency_list_one_year[1]}} AND day_after_approved_or_completed_order_one_year <= {{recency_list_one_year[2]}}) THEN 3
|
||||
WHEN (day_after_approved_or_completed_order_one_year > {{recency_list_one_year[2]}} AND day_after_approved_or_completed_order_one_year <= {{recency_list_one_year[3]}}) THEN 2
|
||||
WHEN day_after_approved_or_completed_order_one_year > {{recency_list_one_year[3]}} THEN 1
|
||||
ELSE -999
|
||||
END AS r_score_one_year,
|
||||
CASE
|
||||
WHEN number_of_approved_or_completed_order_one_year IS NULL THEN NULL
|
||||
WHEN number_of_approved_or_completed_order_one_year <= {{frequency_list_one_year[0]}} THEN 1
|
||||
WHEN (number_of_approved_or_completed_order_one_year > {{frequency_list_one_year[0]}} AND number_of_approved_or_completed_order_one_year <= {{frequency_list_one_year[1]}}) THEN 2
|
||||
WHEN (number_of_approved_or_completed_order_one_year > {{frequency_list_one_year[1]}} AND number_of_approved_or_completed_order_one_year <= {{frequency_list_one_year[2]}}) THEN 3
|
||||
WHEN (number_of_approved_or_completed_order_one_year > {{frequency_list_one_year[2]}} AND number_of_approved_or_completed_order_one_year <= {{frequency_list_one_year[3]}}) THEN 4
|
||||
WHEN number_of_approved_or_completed_order_one_year > {{frequency_list_one_year[3]}} THEN 5
|
||||
ELSE -999
|
||||
END AS f_score_one_year,
|
||||
CASE
|
||||
WHEN total_value_of_approved_or_completed_order_one_year IS NULL THEN NULL
|
||||
WHEN total_value_of_approved_or_completed_order_one_year <= {{monetary_list_one_year[0]}} THEN 1
|
||||
WHEN (total_value_of_approved_or_completed_order_one_year > {{monetary_list_one_year[0]}} AND total_value_of_approved_or_completed_order_one_year <= {{monetary_list_one_year[1]}}) THEN 2
|
||||
WHEN (total_value_of_approved_or_completed_order_one_year > {{monetary_list_one_year[1]}} AND total_value_of_approved_or_completed_order_one_year <= {{monetary_list_one_year[2]}}) THEN 3
|
||||
WHEN (total_value_of_approved_or_completed_order_one_year > {{monetary_list_one_year[2]}} AND total_value_of_approved_or_completed_order_one_year <= {{monetary_list_one_year[3]}}) THEN 4
|
||||
WHEN total_value_of_approved_or_completed_order_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_exchange__rfm AS (
|
||||
SELECT
|
||||
-- ids
|
||||
company_id,
|
||||
company_marking_id,
|
||||
|
||||
-- dimensions
|
||||
segment_lifetime,
|
||||
segment_one_year,
|
||||
|
||||
-- measures
|
||||
day_after_approved_or_completed_order_lifetime,
|
||||
number_of_approved_or_completed_order_lifetime,
|
||||
total_value_of_approved_or_completed_order_lifetime,
|
||||
r_score_lifetime,
|
||||
f_score_lifetime,
|
||||
m_score_lifetime,
|
||||
day_after_approved_or_completed_order_one_year,
|
||||
number_of_approved_or_completed_order_one_year,
|
||||
total_value_of_approved_or_completed_order_one_year,
|
||||
r_score_one_year,
|
||||
f_score_one_year,
|
||||
m_score_one_year,
|
||||
|
||||
-- date/times
|
||||
last_approved_or_completed_order_created_datetime,
|
||||
|
||||
-- metadata
|
||||
_dbt_ran_datetime
|
||||
|
||||
FROM calculate_rfm
|
||||
)
|
||||
SELECT * FROM final__rep_exchange__rfm
|
||||
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
version: 2
|
||||
|
||||
models:
|
||||
- name: dim__dates
|
||||
description: date dimension
|
||||
columns:
|
||||
- name: date_day
|
||||
description: Primary key for 'dim_dates'
|
||||
tests:
|
||||
- unique
|
||||
- not_null
|
||||
|
||||
- name: dim_exchange__companies
|
||||
description: exchange companies
|
||||
columns:
|
||||
- name: company_id
|
||||
description: Primary key for 'dim_exchange__companies'
|
||||
tests:
|
||||
- unique
|
||||
- not_null
|
||||
|
||||
- name: fct_exchange__bookings
|
||||
description: exchange bookings
|
||||
columns:
|
||||
- name: booking_id
|
||||
description: Primary key for 'fct_exchange__bookings'
|
||||
tests:
|
||||
- unique
|
||||
- not_null
|
||||
|
||||
- name: fct_exchange__costs
|
||||
description: exchange transaction_cost
|
||||
columns:
|
||||
- name: transaction_cost_id
|
||||
description: Primary key for 'fct_exchange__transaction_costs'
|
||||
tests:
|
||||
- unique
|
||||
- not_null
|
||||
|
||||
- name: fct_exchange__transaction_orders
|
||||
description: exchange transaction_orders
|
||||
columns:
|
||||
- name: transaction_order_id
|
||||
description: Primary key for 'fct_exchange__transaction_orders'
|
||||
tests:
|
||||
- unique
|
||||
- not_null
|
||||
@@ -0,0 +1,201 @@
|
||||
-- Code and forum link refer: https://gitlab.com/gitlab-data/analytics/-/blob/master/transform/snowflake-dbt/models/sources/date/date_details_source.sql https://stackoverflow.com/questions/71016585/dbt-use-dbt-modeling-to-insert-rows-in-a-table-like-date-dimension-table-in-az
|
||||
-- Import
|
||||
WITH holiday_and_non_working_day_lists AS (
|
||||
SELECT * FROM {{ ref('seed_exchange__holiday_and_non_working_day_lists') }}
|
||||
),
|
||||
|
||||
-- LOGIC
|
||||
date_spine AS (
|
||||
|
||||
{{ dbt_utils.date_spine(
|
||||
start_date="to_date('01/01/2015', 'mm/dd/yyyy')",
|
||||
datepart="day",
|
||||
end_date="dateadd(year, 40, current_date)"
|
||||
)
|
||||
}}
|
||||
|
||||
),
|
||||
|
||||
calculated as (
|
||||
|
||||
SELECT
|
||||
date_day,
|
||||
date_day AS date_actual,
|
||||
|
||||
DAYNAME(date_day) AS day_name,
|
||||
|
||||
DATE_PART('month', date_day) AS month_actual,
|
||||
DATE_PART('year', date_day) AS year_actual,
|
||||
|
||||
DATE_PART(quarter, date_day) AS quarter_actual,
|
||||
|
||||
CASE WHEN DATE_PART(dayofweek, date_day) = 0 THEN 7
|
||||
ELSE DATE_PART(dayofweek, date_day) END AS day_of_week,
|
||||
|
||||
CASE WHEN day_name = 'Mon' THEN date_day
|
||||
ELSE DATEADD('day', 0, DATE_TRUNC('week', date_day)) END AS first_day_of_week,
|
||||
|
||||
CASE WHEN day_name = 'Mon' THEN WEEK(date_day)
|
||||
ELSE WEEK(date_day) END AS week_of_year_temp, --remove this column
|
||||
|
||||
CASE WHEN day_name = 'Mon' AND LEAD(week_of_year_temp) OVER (ORDER BY date_day) = '1'
|
||||
THEN '1'
|
||||
ELSE week_of_year_temp END AS week_of_year,
|
||||
|
||||
DATE_PART('day', date_day) AS day_of_month,
|
||||
|
||||
ROW_NUMBER() OVER (PARTITION BY year_actual, quarter_actual ORDER BY date_day) AS day_of_quarter,
|
||||
ROW_NUMBER() OVER (PARTITION BY year_actual ORDER BY date_day) AS day_of_year,
|
||||
|
||||
-- @TODO @GERSON ,done
|
||||
-- BUSINESS LOGIC: Feb - Jan (2022), Feb - Jan (2023)
|
||||
CASE WHEN month_actual in (2,3,4,5,6,7,8,9,10,11,12) THEN year_actual
|
||||
when DATE_PART('month', DATEADD( month,-1, date_day) ) =12 THEN year_actual-1
|
||||
|
||||
ELSE (year_actual+1) END AS fiscal_year,
|
||||
|
||||
-- @TODO @GERSON , done
|
||||
-- BUSINESS LOGIC: Feb - Apr (Q1), May - Jul (Q2), Aug - Oct (Q3), Nov - Jan (Q4)
|
||||
CASE WHEN month_actual in (2,3,4) THEN '1'
|
||||
WHEN month_actual in (5,6,7) THEN '2'
|
||||
WHEN month_actual in (8,9,10) THEN '3'
|
||||
WHEN month_actual in (11,12) THEN '4'
|
||||
WHEN DATE_PART('month', DATEADD(month,-1,date_day)) =12 THEN '4'
|
||||
-- WHEN month_actual= DATE_PART('year', month_actual) +1 and month_actual=1 THEN '4'
|
||||
ELSE '4' END AS fiscal_quarter,
|
||||
|
||||
-- @TODO @GERSON ,done
|
||||
ROW_NUMBER() OVER (PARTITION BY fiscal_year, fiscal_quarter ORDER BY date_day) AS day_of_fiscal_quarter,
|
||||
ROW_NUMBER() OVER (PARTITION BY fiscal_year ORDER BY date_day) AS day_of_fiscal_year,
|
||||
|
||||
TO_CHAR(date_day, 'MMMM') AS month_name,
|
||||
|
||||
TRUNC(date_day, 'Month') AS first_day_of_month,
|
||||
LAST_VALUE(date_day) OVER (PARTITION BY year_actual, month_actual ORDER BY date_day) AS last_day_of_month,
|
||||
|
||||
FIRST_VALUE(date_day) OVER (PARTITION BY year_actual ORDER BY date_day) AS first_day_of_year,
|
||||
LAST_VALUE(date_day) OVER (PARTITION BY year_actual ORDER BY date_day) AS last_day_of_year,
|
||||
|
||||
FIRST_VALUE(date_day) OVER (PARTITION BY year_actual, quarter_actual ORDER BY date_day) AS first_day_of_quarter,
|
||||
LAST_VALUE(date_day) OVER (PARTITION BY year_actual, quarter_actual ORDER BY date_day) AS last_day_of_quarter,
|
||||
|
||||
-- @TODO @GERSON ,done
|
||||
-- Change this 2 too
|
||||
FIRST_VALUE(date_day) OVER (PARTITION BY fiscal_year, fiscal_quarter ORDER BY date_day) AS first_day_of_fiscal_quarter,
|
||||
LAST_VALUE(date_day) OVER (PARTITION BY fiscal_year, fiscal_quarter ORDER BY date_day) AS last_day_of_fiscal_quarter,
|
||||
|
||||
-- @TODO @GERSON,done
|
||||
FIRST_VALUE(date_day) OVER (PARTITION BY fiscal_year ORDER BY date_day) AS first_day_of_fiscal_year,
|
||||
LAST_VALUE(date_day) OVER (PARTITION BY fiscal_year ORDER BY date_day) AS last_day_of_fiscal_year,
|
||||
|
||||
-- @TODO @GERSON ,done
|
||||
DATEDIFF('week', first_day_of_fiscal_year, date_actual)+1 AS week_of_fiscal_year,
|
||||
|
||||
-- @TODO @GERSON ,done
|
||||
CASE WHEN EXTRACT('month', date_day) = 1 THEN 12
|
||||
ELSE EXTRACT('month', date_day) - 1 END AS month_of_fiscal_year,
|
||||
|
||||
LAST_VALUE(date_day) OVER (PARTITION BY first_day_of_week ORDER BY date_day) AS last_day_of_week,
|
||||
|
||||
(year_actual || '-Q' || fiscal_quarter) AS quarter_name,
|
||||
|
||||
-- @TODO @GERSON,done
|
||||
(fiscal_year || '-' || DECODE(fiscal_quarter,
|
||||
1, 'Q1',
|
||||
2, 'Q2',
|
||||
3, 'Q3',
|
||||
4, 'Q4')) AS fiscal_quarter_name,
|
||||
('FY' || SUBSTR(fiscal_quarter_name, 3, 7)) AS fiscal_quarter_name_fy,
|
||||
DENSE_RANK() OVER (ORDER BY fiscal_quarter_name) AS fiscal_quarter_number_absolute,
|
||||
--here check
|
||||
fiscal_year || '-' || MONTHNAME(date_day) AS fiscal_month_name,
|
||||
('FY' || SUBSTR(fiscal_month_name, 3, 8)) AS fiscal_month_name_fy,
|
||||
|
||||
-- @TODO @GERSON
|
||||
-- Use the Seed, we will not doing the hard code in SQL, we use CSV to refer the holiday and desc
|
||||
holiday_and_non_working_day_lists.holiday_desc,
|
||||
holiday_and_non_working_day_lists.is_holiday,
|
||||
holiday_and_non_working_day_lists.holiday_race,
|
||||
holiday_and_non_working_day_lists.holiday_country,
|
||||
holiday_and_non_working_day_lists.holiday_state,
|
||||
holiday_and_non_working_day_lists.is_non_working_day,
|
||||
-- @TODO @GERSON
|
||||
DATE_TRUNC('month', last_day_of_fiscal_quarter) AS last_month_of_fiscal_quarter,
|
||||
IFF(DATE_TRUNC('month', last_day_of_fiscal_quarter) = date_actual, TRUE, FALSE) AS is_first_day_of_last_month_of_fiscal_quarter,
|
||||
DATE_TRUNC('month', last_day_of_fiscal_year) AS last_month_of_fiscal_year,
|
||||
IFF(DATE_TRUNC('month', last_day_of_fiscal_year) = date_actual, TRUE, FALSE) AS is_first_day_of_last_month_of_fiscal_year,
|
||||
|
||||
DATEADD('day',7,DATEADD('month',1,first_day_of_month)) AS snapshot_date_fpa,
|
||||
DATEADD('day',44,DATEADD('month',1,first_day_of_month)) AS snapshot_date_billings,
|
||||
|
||||
'{{ modules.datetime.datetime.now(modules.pytz.timezone("Asia/Kuala_Lumpur")) }}' AS _dbt_ran_datetime
|
||||
|
||||
FROM date_spine
|
||||
|
||||
LEFT JOIN holiday_and_non_working_day_lists
|
||||
ON date_spine.date_day = to_date(holiday_and_non_working_day_lists.date, 'dd/mm/yyyy')
|
||||
|
||||
QUALIFY date_actual >= '2016-01-01'
|
||||
|
||||
ORDER BY date_day
|
||||
|
||||
|
||||
),
|
||||
|
||||
final AS (
|
||||
|
||||
SELECT
|
||||
date_day,
|
||||
date_actual,
|
||||
day_name,
|
||||
month_actual,
|
||||
year_actual,
|
||||
quarter_actual,
|
||||
day_of_week,
|
||||
first_day_of_week,
|
||||
week_of_year,
|
||||
day_of_month,
|
||||
day_of_quarter,
|
||||
day_of_year,
|
||||
fiscal_year,
|
||||
fiscal_quarter,
|
||||
day_of_fiscal_quarter,
|
||||
day_of_fiscal_year,
|
||||
month_name,
|
||||
first_day_of_month,
|
||||
last_day_of_month,
|
||||
first_day_of_year,
|
||||
last_day_of_year,
|
||||
first_day_of_quarter,
|
||||
last_day_of_quarter,
|
||||
first_day_of_fiscal_quarter,
|
||||
last_day_of_fiscal_quarter,
|
||||
first_day_of_fiscal_year,
|
||||
last_day_of_fiscal_year,
|
||||
week_of_fiscal_year,
|
||||
month_of_fiscal_year,
|
||||
last_day_of_week,
|
||||
quarter_name,
|
||||
fiscal_quarter_name,
|
||||
fiscal_quarter_name_fy,
|
||||
fiscal_quarter_number_absolute,
|
||||
fiscal_month_name,
|
||||
fiscal_month_name_fy,
|
||||
holiday_desc,
|
||||
is_holiday,
|
||||
holiday_race,
|
||||
holiday_country,
|
||||
holiday_state,
|
||||
is_non_working_day,
|
||||
last_month_of_fiscal_quarter,
|
||||
is_first_day_of_last_month_of_fiscal_quarter,
|
||||
last_month_of_fiscal_year,
|
||||
is_first_day_of_last_month_of_fiscal_year,
|
||||
snapshot_date_fpa,
|
||||
snapshot_date_billings,
|
||||
_dbt_ran_datetime
|
||||
FROM calculated
|
||||
|
||||
)
|
||||
|
||||
SELECT * FROM final
|
||||
@@ -0,0 +1,5 @@
|
||||
WITH users AS (
|
||||
SELECT * FROM {{ ref('stg_crisp__users') }}
|
||||
)
|
||||
|
||||
SELECT * FROM users
|
||||
@@ -0,0 +1,197 @@
|
||||
-- IMPORTS
|
||||
WITH companies AS (
|
||||
SELECT * FROM {{ ref('int_exchange__companies_join_segments') }}
|
||||
),
|
||||
|
||||
company_addresses AS (
|
||||
SELECT * FROM {{ ref('stg_exchange__company_addresses') }}
|
||||
),
|
||||
|
||||
company_wallets AS (
|
||||
SELECT * FROM {{ ref('stg_exchange__company_wallets') }}
|
||||
),
|
||||
|
||||
companies_brg_users AS (
|
||||
SELECT * FROM {{ ref('stg_exchange__companies_brg_users') }}
|
||||
),
|
||||
|
||||
company_contacts AS (
|
||||
SELECT * FROM {{ ref('stg_exchange__company_contacts') }}
|
||||
),
|
||||
|
||||
company_documents AS (
|
||||
SELECT * FROM {{ ref('stg_exchange__company_documents') }}
|
||||
),
|
||||
|
||||
currencies AS (
|
||||
SELECT * FROM {{ ref('stg_exchange__currencies') }}
|
||||
),
|
||||
|
||||
-- -- LOGICS
|
||||
count_company_user AS (
|
||||
SELECT
|
||||
company_id,
|
||||
COUNT(user_id) AS count_user
|
||||
|
||||
FROM companies_brg_users
|
||||
|
||||
GROUP BY company_id
|
||||
),
|
||||
|
||||
company_billing_addresses AS (
|
||||
SELECT
|
||||
*
|
||||
|
||||
FROM company_addresses
|
||||
|
||||
WHERE
|
||||
is_billing_address = '1'
|
||||
),
|
||||
|
||||
latest_company_upload_identity_documents AS (
|
||||
SELECT
|
||||
*,
|
||||
row_number() OVER
|
||||
(PARTITION BY company_id
|
||||
ORDER BY created_datetime DESC) AS latest_row_number
|
||||
|
||||
FROM company_documents
|
||||
|
||||
WHERE
|
||||
document_type IN ('IDENTITY_CARD','SSM_REGISTRATION')
|
||||
AND
|
||||
status = 'APPROVED'
|
||||
|
||||
QUALIFY
|
||||
latest_row_number = '1'
|
||||
|
||||
),
|
||||
|
||||
companies_rename_and_join_table AS (
|
||||
SELECT
|
||||
companies.company_id,
|
||||
companies.name,
|
||||
companies.company_marking_id,
|
||||
companies.autocount_id,
|
||||
companies.company_type,
|
||||
companies.business_type,
|
||||
companies.exchange_rate_segment,
|
||||
companies.is_migrated_company,
|
||||
companies.status,
|
||||
companies.created_datetime AS company_created_datetime,
|
||||
|
||||
company_contacts.contact_id,
|
||||
company_contacts.contact_name,
|
||||
company_contacts.phone AS contact_phone,
|
||||
company_contacts.email AS contact_email,
|
||||
company_contacts.wechat AS contact_wechat,
|
||||
|
||||
company_billing_addresses.company_address_id,
|
||||
company_billing_addresses.country_id,
|
||||
company_billing_addresses.country_name,
|
||||
company_billing_addresses.country_short_code,
|
||||
company_billing_addresses.state_id,
|
||||
company_billing_addresses.state_name,
|
||||
company_billing_addresses.district_id,
|
||||
company_billing_addresses.district_name,
|
||||
company_billing_addresses.postcode,
|
||||
company_billing_addresses.address_line_one,
|
||||
company_billing_addresses.address_line_two,
|
||||
|
||||
company_wallets.wallet_id,
|
||||
IFF(company_wallets.wallet_id IS NOT NULL, 1, 0) AS has_wallet,
|
||||
company_wallets.amount AS wallet_balance,
|
||||
company_wallets.currency_id AS wallet_currency_id,
|
||||
currencies.name AS wallet_currency_name,
|
||||
company_wallets.created_datetime AS wallet_created_datetime,
|
||||
company_wallets.updated_datetime AS wallet_updated_datetime,
|
||||
|
||||
latest_company_upload_identity_documents.document_id AS identity_document_id,
|
||||
latest_company_upload_identity_documents.document_type AS identity_document_type,
|
||||
latest_company_upload_identity_documents.reference AS identity_reference,
|
||||
latest_company_upload_identity_documents.status AS identity_status,
|
||||
latest_company_upload_identity_documents.approved_datetime AS identity_approved_datetime,
|
||||
latest_company_upload_identity_documents.created_datetime AS identity_created_datetime,
|
||||
|
||||
count_company_user.count_user AS number_of_user,
|
||||
'{{ modules.datetime.datetime.now(modules.pytz.timezone("Asia/Kuala_Lumpur")) }}' AS _dbt_ran_datetime
|
||||
|
||||
FROM companies
|
||||
|
||||
LEFT JOIN company_billing_addresses
|
||||
ON (companies.company_id = company_billing_addresses.company_id)
|
||||
|
||||
LEFT JOIN company_wallets
|
||||
ON (companies.company_id = company_wallets.company_id)
|
||||
|
||||
LEFT JOIN count_company_user
|
||||
ON (companies.company_id = count_company_user.company_id)
|
||||
|
||||
LEFT JOIN company_contacts
|
||||
ON (companies.company_id = company_contacts.company_id)
|
||||
|
||||
LEFT JOIN latest_company_upload_identity_documents
|
||||
ON (companies.company_id = latest_company_upload_identity_documents.company_id)
|
||||
|
||||
LEFT JOIN currencies
|
||||
ON (company_wallets.currency_id = currencies.currency_id)
|
||||
),
|
||||
|
||||
-- FINAL
|
||||
final__dim_exchange__companies AS (
|
||||
SELECT
|
||||
-- ids
|
||||
company_id,
|
||||
company_marking_id,
|
||||
autocount_id,
|
||||
contact_id,
|
||||
company_address_id,
|
||||
country_id,
|
||||
state_id,
|
||||
district_id,
|
||||
wallet_id,
|
||||
wallet_currency_id,
|
||||
identity_document_id,
|
||||
|
||||
-- dimensions
|
||||
name,
|
||||
company_type,
|
||||
business_type,
|
||||
exchange_rate_segment,
|
||||
is_migrated_company,
|
||||
status,
|
||||
contact_name,
|
||||
contact_phone,
|
||||
contact_email,
|
||||
contact_wechat,
|
||||
country_name,
|
||||
country_short_code,
|
||||
state_name,
|
||||
district_name,
|
||||
postcode,
|
||||
address_line_one,
|
||||
address_line_two,
|
||||
has_wallet,
|
||||
wallet_currency_name,
|
||||
identity_document_type,
|
||||
identity_reference,
|
||||
identity_status,
|
||||
|
||||
-- measures
|
||||
wallet_balance,
|
||||
number_of_user,
|
||||
|
||||
-- date/times
|
||||
company_created_datetime,
|
||||
wallet_created_datetime,
|
||||
wallet_updated_datetime,
|
||||
identity_approved_datetime,
|
||||
identity_created_datetime,
|
||||
|
||||
-- metadata
|
||||
_dbt_ran_datetime
|
||||
|
||||
FROM companies_rename_and_join_table
|
||||
)
|
||||
|
||||
SELECT * FROM final__dim_exchange__companies
|
||||
@@ -0,0 +1,43 @@
|
||||
-- IMPORT
|
||||
WITH currencies AS (
|
||||
SELECT * FROM {{ ref('stg_exchange__currencies') }}
|
||||
),
|
||||
|
||||
-- LOGIC
|
||||
currencies_rename AS (
|
||||
SELECT
|
||||
currencies.currency_id,
|
||||
currencies.name AS currency_name,
|
||||
currencies.short_code AS currency_short_code,
|
||||
currencies.symbol AS currency_symbol,
|
||||
currencies.country_name AS currency_country_name,
|
||||
currencies.created_datetime AS currency_created_datetime,
|
||||
'{{ modules.datetime.datetime.now(modules.pytz.timezone("Asia/Kuala_Lumpur")) }}' AS _dbt_ran_datetime
|
||||
|
||||
FROM currencies
|
||||
),
|
||||
|
||||
-- FINAL
|
||||
final__dim_exchange__currencies AS (
|
||||
SELECT
|
||||
-- ids
|
||||
currency_id,
|
||||
|
||||
-- dimensions
|
||||
currency_name,
|
||||
currency_short_code,
|
||||
currency_symbol,
|
||||
currency_country_name,
|
||||
|
||||
-- measures
|
||||
|
||||
-- date/times
|
||||
currency_created_datetime,
|
||||
|
||||
-- metadata
|
||||
_dbt_ran_datetime
|
||||
|
||||
FROM currencies_rename
|
||||
)
|
||||
|
||||
SELECT * FROM final__dim_exchange__currencies
|
||||
@@ -0,0 +1,176 @@
|
||||
--IMPORT
|
||||
WITH messages AS (
|
||||
SELECT * FROM {{ ref('int_crisp__messages_generate_dialog_ids') }}
|
||||
ORDER BY conversation_id, created_datetime, message_id
|
||||
),
|
||||
|
||||
--LOGIC
|
||||
messages_with_ftu_id AS (
|
||||
SELECT
|
||||
*,
|
||||
FIRST_VALUE(CASE WHEN messages.message_generated_by = 'user' THEN messages.user_id END)
|
||||
IGNORE NULLS
|
||||
OVER (PARTITION BY messages.dialog_id ORDER BY messages.created_datetime ASC) AS first_user_id,
|
||||
LAST_VALUE(CASE WHEN messages.message_generated_by = 'user' THEN messages.user_id END)
|
||||
IGNORE NULLS
|
||||
OVER (PARTITION BY messages.dialog_id ORDER BY messages.created_datetime ASC) AS last_user_id,
|
||||
|
||||
FIRST_VALUE(CASE WHEN messages.message_generated_by = 'operator' THEN messages.user_id END)
|
||||
IGNORE NULLS
|
||||
OVER (PARTITION BY messages.dialog_id ORDER BY messages.created_datetime ASC) AS first_operator_id,
|
||||
LAST_VALUE(CASE WHEN messages.message_generated_by = 'operator' THEN messages.user_id END)
|
||||
IGNORE NULLS
|
||||
OVER (PARTITION BY messages.dialog_id ORDER BY messages.created_datetime ASC) AS last_operator_id
|
||||
|
||||
from messages
|
||||
),
|
||||
|
||||
dialog_message_last_row AS (
|
||||
SELECT
|
||||
RANK() OVER (PARTITION BY dialog_id ORDER BY created_datetime DESC) AS last_row_desc_rank,
|
||||
*
|
||||
|
||||
FROM messages
|
||||
QUALIFY last_row_desc_rank = 1
|
||||
),
|
||||
|
||||
transform_to_dialogs AS (
|
||||
SELECT
|
||||
messages_with_ftu_id.dialog_id AS dialog_id,
|
||||
max(messages_with_ftu_id.conversation_id) AS conversation_id,
|
||||
array_agg(messages_with_ftu_id.message_id) AS message_ids,
|
||||
|
||||
CASE
|
||||
WHEN max(dialog_message_last_row.event_type) = 'state:resolved' THEN 'close'
|
||||
WHEN max(dialog_message_last_row.event_type) IS NULL THEN 'open'
|
||||
ELSE 'ERROR, Please contact DATA team'
|
||||
END AS dialog_status,
|
||||
|
||||
min(messages_with_ftu_id.created_datetime) AS dialog_created_datetime,
|
||||
|
||||
min(IFF(messages_with_ftu_id.message_generated_by = 'user',
|
||||
messages_with_ftu_id.created_datetime,
|
||||
null)) AS first_user_reply_datetime,
|
||||
|
||||
min(IFF(messages_with_ftu_id.message_generated_by = 'operator',
|
||||
messages_with_ftu_id.created_datetime,
|
||||
null)) AS first_operator_reply_datetime,
|
||||
|
||||
min(IFF(messages_with_ftu_id.message_generated_by = 'bot',
|
||||
messages_with_ftu_id.created_datetime,
|
||||
null)) AS first_bot_reply_datetime,
|
||||
|
||||
max(IFF(messages_with_ftu_id.message_generated_by = 'user',
|
||||
messages_with_ftu_id.created_datetime,
|
||||
null)) AS last_user_reply_datetime,
|
||||
|
||||
max(IFF(messages_with_ftu_id.message_generated_by = 'operator',
|
||||
messages_with_ftu_id.created_datetime,
|
||||
null)) AS last_operator_reply_datetime,
|
||||
|
||||
max(IFF(messages_with_ftu_id.message_generated_by = 'bot',
|
||||
messages_with_ftu_id.created_datetime,
|
||||
null)) AS last_bot_reply_datetime,
|
||||
|
||||
max(IFF((messages_with_ftu_id.event_type = 'state:resolved'),
|
||||
messages_with_ftu_id.created_datetime,
|
||||
null)) AS dialog_solved_datetime,
|
||||
|
||||
|
||||
array_agg(distinct(
|
||||
IFF(messages_with_ftu_id.message_generated_by = 'user' ,
|
||||
messages_with_ftu_id.user_id,
|
||||
NULL))) AS user_ids,
|
||||
|
||||
count(distinct(
|
||||
IFF(messages_with_ftu_id.message_generated_by = 'user',
|
||||
messages_with_ftu_id.user_id,
|
||||
null))) AS number_of_user_involved,
|
||||
|
||||
max(messages_with_ftu_id.first_user_id) AS first_user_id,
|
||||
max(messages_with_ftu_id.last_user_id) AS last_user_id,
|
||||
|
||||
|
||||
array_agg(distinct(
|
||||
IFF(messages_with_ftu_id.message_generated_by = 'operator' ,
|
||||
messages_with_ftu_id.user_id,
|
||||
NULL))) AS operator_ids,
|
||||
|
||||
count(distinct(
|
||||
IFF(messages_with_ftu_id.message_generated_by = 'operator',
|
||||
messages_with_ftu_id.user_id,
|
||||
null))) AS number_of_operator_involved,
|
||||
|
||||
max(messages_with_ftu_id.first_operator_id) AS first_operator_id,
|
||||
max(messages_with_ftu_id.last_operator_id) AS last_operator_id,
|
||||
|
||||
|
||||
count(distinct(
|
||||
IFF(messages_with_ftu_id.message_generated_by = 'user',
|
||||
messages_with_ftu_id.message_id,
|
||||
null))) AS number_of_user_chat,
|
||||
|
||||
count(distinct(
|
||||
IFF(messages_with_ftu_id.message_generated_by = 'operator',
|
||||
messages_with_ftu_id.message_id,
|
||||
null))) AS number_of_operator_chat,
|
||||
|
||||
count(distinct(
|
||||
IFF(messages_with_ftu_id.message_generated_by = 'bot',
|
||||
messages_with_ftu_id.message_id,
|
||||
null))) AS number_of_bot_chat,
|
||||
|
||||
'{{ modules.datetime.datetime.now(modules.pytz.timezone("Asia/Kuala_Lumpur")) }}' AS _dbt_ran_datetime
|
||||
|
||||
|
||||
FROM messages_with_ftu_id
|
||||
|
||||
LEFT JOIN dialog_message_last_row
|
||||
ON (dialog_message_last_row.dialog_id = messages_with_ftu_id.dialog_id)
|
||||
|
||||
GROUP BY
|
||||
messages_with_ftu_id.dialog_id
|
||||
),
|
||||
|
||||
-- FINAL
|
||||
final_fct_crisp__dialogs AS (
|
||||
SELECT
|
||||
-- ids
|
||||
dialog_id,
|
||||
conversation_id,
|
||||
message_ids,
|
||||
user_ids,
|
||||
operator_ids,
|
||||
first_user_id,
|
||||
last_user_id,
|
||||
first_operator_id,
|
||||
last_operator_id,
|
||||
|
||||
-- dimensions
|
||||
dialog_status,
|
||||
|
||||
-- measures
|
||||
number_of_user_involved,
|
||||
number_of_operator_involved,
|
||||
number_of_user_chat,
|
||||
number_of_operator_chat,
|
||||
number_of_bot_chat,
|
||||
|
||||
-- date/times
|
||||
dialog_created_datetime,
|
||||
dialog_solved_datetime,
|
||||
first_user_reply_datetime,
|
||||
first_operator_reply_datetime,
|
||||
first_bot_reply_datetime,
|
||||
last_user_reply_datetime,
|
||||
last_operator_reply_datetime,
|
||||
last_bot_reply_datetime,
|
||||
|
||||
-- metadata
|
||||
_dbt_ran_datetime
|
||||
|
||||
|
||||
FROM transform_to_dialogs
|
||||
)
|
||||
|
||||
SELECT * FROM final_fct_crisp__dialogs
|
||||
@@ -0,0 +1,107 @@
|
||||
-- IMPORTS
|
||||
{% set booking_status = dbt_utils.get_column_values(
|
||||
table=ref('stg_exchange__booking_logs'),
|
||||
column='status') %}
|
||||
|
||||
WITH bookings AS (
|
||||
SELECT * FROM {{ ref('int_exchange__bookings_get_estimate_booking_values') }}
|
||||
),
|
||||
|
||||
booking_logs AS (
|
||||
SELECT * FROM {{ ref('stg_exchange__booking_logs') }}
|
||||
),
|
||||
|
||||
-- LOGICS
|
||||
booking_status_datetime AS (
|
||||
|
||||
SELECT
|
||||
booking_id,
|
||||
MIN(created_datetime) AS booking_created_datetime,
|
||||
{%- for status in booking_status %}
|
||||
MAX(CASE WHEN status = '{{status}}' THEN updated_datetime END) AS booking_{{status.lower()}}_datetime {%- if not loop.last %},{% endif -%}
|
||||
{% endfor %}
|
||||
|
||||
FROM booking_logs
|
||||
|
||||
GROUP BY
|
||||
booking_id
|
||||
),
|
||||
|
||||
bookings_lists AS (
|
||||
SELECT
|
||||
bookings.*,
|
||||
|
||||
{% for column_name in ["company", "user"] %}
|
||||
CASE
|
||||
WHEN ROW_NUMBER() OVER (PARTITION BY bookings.{{column_name}}_id ORDER BY bookings.created_datetime) = 1 THEN 1
|
||||
ELSE 0
|
||||
END AS is_first_time_{{column_name}},
|
||||
|
||||
CASE
|
||||
WHEN bookings.status = 'COMPLETED'
|
||||
AND
|
||||
MIN(IFF(bookings.status = 'COMPLETED', bookings.created_datetime, NULL))
|
||||
OVER (PARTITION BY bookings.{{column_name}}_id)
|
||||
= bookings.created_datetime
|
||||
THEN 1
|
||||
ELSE 0
|
||||
END AS is_first_time_{{column_name}}_completed,
|
||||
{% endfor %}
|
||||
|
||||
booking_status_datetime.booking_created_datetime,
|
||||
{%- for status in booking_status %}
|
||||
booking_status_datetime.booking_{{status.lower()}}_datetime {%- if not loop.last %},{% endif -%}
|
||||
{% endfor %}
|
||||
|
||||
FROM
|
||||
bookings
|
||||
|
||||
LEFT JOIN booking_status_datetime
|
||||
ON (bookings.booking_id = booking_status_datetime.booking_id)
|
||||
),
|
||||
|
||||
-- FINAL
|
||||
final_fct_exchange__bookings AS (
|
||||
SELECT
|
||||
-- ids
|
||||
booking_id,
|
||||
booking_marking_id,
|
||||
company_id,
|
||||
user_id,
|
||||
bank_id,
|
||||
fix_currency_id,
|
||||
quote_currency_id,
|
||||
base_currency_id,
|
||||
|
||||
-- dimensions
|
||||
service_type,
|
||||
estimate_payment_method,
|
||||
status,
|
||||
is_first_time_company,
|
||||
is_first_time_company_completed,
|
||||
is_first_time_user,
|
||||
is_first_time_user_completed,
|
||||
|
||||
-- measures
|
||||
estimate_base_to_quote_currency_exchange_rate,
|
||||
estimate_quote_value,
|
||||
estimate_base_value,
|
||||
estimate_value_rm,
|
||||
|
||||
-- date/times
|
||||
booking_created_datetime,
|
||||
booking_approved_datetime,
|
||||
booking_completed_datetime,
|
||||
booking_suspended_datetime,
|
||||
deleted_datetime,
|
||||
created_datetime,
|
||||
updated_datetime,
|
||||
|
||||
-- metadata
|
||||
'{{ modules.datetime.datetime.now(modules.pytz.timezone("Asia/Kuala_Lumpur")) }}' AS _dbt_ran_datetime
|
||||
|
||||
FROM bookings_lists
|
||||
)
|
||||
|
||||
SELECT * FROM final_fct_exchange__bookings
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
--IMPORT
|
||||
With documents AS (
|
||||
SELECT * FROM {{ ref('stg_exchange__company_documents') }}
|
||||
),
|
||||
|
||||
--LOGIC
|
||||
company_identity_documents AS (
|
||||
SELECT
|
||||
*
|
||||
|
||||
FROM documents
|
||||
|
||||
WHERE
|
||||
document_type IN ('IDENTITY_CARD','SSM_REGISTRATION')
|
||||
),
|
||||
|
||||
|
||||
--FINAL
|
||||
final__fct_exchange__company_identity_documents AS (
|
||||
SELECT
|
||||
document_id,
|
||||
company_id,
|
||||
document_type AS identity_document_type_name,
|
||||
reference AS identity_number,
|
||||
status AS identity_status,
|
||||
approver_user_id AS identity_approver_user_id,
|
||||
deleted_datetime AS identity_deleted_datetine,
|
||||
approved_datetime AS identity_approved_datetine,
|
||||
created_datetime AS identity_created_datetime
|
||||
|
||||
FROM
|
||||
company_identity_documents
|
||||
)
|
||||
|
||||
SELECT * FROM final__fct_exchange__company_identity_documents
|
||||
@@ -0,0 +1,134 @@
|
||||
-- IMPORTS
|
||||
{% set cost_status = dbt_utils.get_column_values(
|
||||
table=ref('stg_exchange__transaction_order_logs'),
|
||||
column='status') %}
|
||||
|
||||
WITH transaction_costs AS (
|
||||
SELECT * FROM {{ ref('stg_exchange__transaction_costs') }}
|
||||
),
|
||||
|
||||
transaction_cost_logs AS (
|
||||
SELECT * FROM {{ ref('stg_exchange__transaction_cost_logs') }}
|
||||
),
|
||||
|
||||
-- LOGICS
|
||||
transaction_cost_status_datetime AS (
|
||||
|
||||
SELECT
|
||||
transaction_cost_id,
|
||||
MIN(created_datetime) AS cost_created_datetime,
|
||||
|
||||
{%- for status in cost_status %}
|
||||
MAX(CASE WHEN status = '{{status}}' THEN updated_datetime END) AS cost_{{status.lower()}}_datetime {%- if not loop.last %},{% endif -%}
|
||||
{% endfor %}
|
||||
|
||||
FROM transaction_cost_logs
|
||||
|
||||
GROUP BY
|
||||
transaction_cost_id
|
||||
),
|
||||
|
||||
transaction_costs_lists AS (
|
||||
SELECT
|
||||
transaction_costs.transaction_cost_id,
|
||||
transaction_costs.transaction_order_id,
|
||||
transaction_costs.supplier_company_id,
|
||||
transaction_costs.bank_id,
|
||||
transaction_costs.base_currency_id,
|
||||
transaction_costs.quote_currency_id,
|
||||
transaction_costs.transaction_type,
|
||||
transaction_costs.payment_method,
|
||||
transaction_costs.status,
|
||||
transaction_costs.payment_reference,
|
||||
transaction_costs.bill_number,
|
||||
transaction_costs.base_value,
|
||||
transaction_costs.quote_value,
|
||||
transaction_costs.base_to_quote_currency_exchange_rate,
|
||||
transaction_costs.base_tax,
|
||||
transaction_costs.base_service_charge,
|
||||
|
||||
-- use for future if base currency id other from '1'
|
||||
IFF(transaction_costs.base_currency_id = '1',
|
||||
transaction_costs.base_value,
|
||||
-9999999999) AS value_rm,
|
||||
|
||||
-- use for future if base currency id other from '1'
|
||||
IFF(transaction_costs.base_currency_id = '1',
|
||||
transaction_costs.base_tax,
|
||||
-9999999999) AS tax_rm,
|
||||
|
||||
-- use for future if base currency id other from '1'
|
||||
IFF(transaction_costs.base_currency_id = '1',
|
||||
transaction_costs.base_service_charge,
|
||||
-9999999999) AS service_charge_rm,
|
||||
|
||||
(value_rm + service_charge_rm + tax_rm) AS total_value_rm,
|
||||
|
||||
transaction_costs.expired_datetime,
|
||||
transaction_costs.deleted_datetime,
|
||||
transaction_costs.created_datetime,
|
||||
transaction_costs.updated_datetime,
|
||||
|
||||
transaction_cost_status_datetime.cost_created_datetime,
|
||||
{%- for status in cost_status %}
|
||||
transaction_cost_status_datetime.cost_{{status.lower()}}_datetime,
|
||||
{% endfor %}
|
||||
|
||||
'{{ modules.datetime.datetime.now(modules.pytz.timezone("Asia/Kuala_Lumpur")) }}' AS _dbt_ran_datetime
|
||||
|
||||
FROM transaction_costs
|
||||
|
||||
LEFT JOIN transaction_cost_status_datetime
|
||||
ON (transaction_costs.transaction_cost_id = transaction_cost_status_datetime.transaction_cost_id)
|
||||
),
|
||||
|
||||
|
||||
-- FINAL
|
||||
final__fct_exchange__transaction_costs AS (
|
||||
SELECT
|
||||
-- ids
|
||||
transaction_cost_id,
|
||||
transaction_order_id,
|
||||
supplier_company_id,
|
||||
bank_id,
|
||||
base_currency_id,
|
||||
quote_currency_id,
|
||||
|
||||
-- dimensions
|
||||
transaction_type,
|
||||
payment_method,
|
||||
status,
|
||||
payment_reference,
|
||||
bill_number,
|
||||
|
||||
-- measures
|
||||
base_value,
|
||||
quote_value,
|
||||
base_to_quote_currency_exchange_rate,
|
||||
base_tax,
|
||||
base_service_charge,
|
||||
value_rm,
|
||||
tax_rm,
|
||||
service_charge_rm,
|
||||
total_value_rm,
|
||||
|
||||
-- date/times
|
||||
expired_datetime,
|
||||
deleted_datetime,
|
||||
created_datetime,
|
||||
updated_datetime,
|
||||
cost_created_datetime,
|
||||
cost_pending_submission_datetime,
|
||||
cost_pending_verification_datetime,
|
||||
cost_approved_datetime,
|
||||
cost_completed_datetime,
|
||||
cost_rejected_datetime,
|
||||
cost_suspended_datetime
|
||||
|
||||
-- metadata
|
||||
_dbt_ran_datetime
|
||||
|
||||
FROM transaction_costs_lists
|
||||
)
|
||||
|
||||
SELECT * FROM final__fct_exchange__transaction_costs
|
||||
@@ -0,0 +1,158 @@
|
||||
-- IMPORTS
|
||||
{% set order_status = dbt_utils.get_column_values(
|
||||
table=ref('stg_exchange__transaction_order_logs'),
|
||||
column='status') %}
|
||||
|
||||
WITH transaction_orders AS (
|
||||
SELECT * FROM {{ ref('int_exchange__transaction_orders_get_user_ids') }}
|
||||
),
|
||||
|
||||
transaction_order_logs AS (
|
||||
SELECT * FROM {{ ref('stg_exchange__transaction_order_logs') }}
|
||||
),
|
||||
|
||||
-- LOGICS
|
||||
transaction_order_order_status_datetime AS (
|
||||
|
||||
SELECT
|
||||
transaction_order_id,
|
||||
MIN(created_datetime) AS order_created_datetime,
|
||||
|
||||
{%- for status in order_status %}
|
||||
MAX(CASE WHEN status = '{{status}}' THEN updated_datetime END) AS order_{{status.lower()}}_datetime {%- if not loop.last %},{% endif -%}
|
||||
{% endfor %}
|
||||
|
||||
FROM transaction_order_logs
|
||||
|
||||
GROUP BY
|
||||
transaction_order_id
|
||||
),
|
||||
|
||||
|
||||
transaction_orders_lists AS (
|
||||
SELECT
|
||||
transaction_orders.transaction_order_id,
|
||||
transaction_orders.booking_id,
|
||||
transaction_orders.bank_id,
|
||||
transaction_orders.company_id,
|
||||
transaction_orders.user_id,
|
||||
transaction_orders.status AS order_status,
|
||||
transaction_orders.transaction_type,
|
||||
transaction_orders.payment_method,
|
||||
transaction_orders.base_currency_id,
|
||||
transaction_orders.quote_currency_id,
|
||||
transaction_orders.base_to_quote_currency_exchange_rate,
|
||||
transaction_orders.payment_reference,
|
||||
transaction_orders.bill_number,
|
||||
transaction_orders.expired_datetime AS order_expired_datetime,
|
||||
|
||||
transaction_orders.base_value,
|
||||
transaction_orders.quote_value,
|
||||
-- use for future if base currency id other from '1'
|
||||
IFF(transaction_orders.base_currency_id = '1',
|
||||
transaction_orders.base_value,
|
||||
-9999999999) AS value_rm,
|
||||
|
||||
transaction_orders.base_tax AS base_tax,
|
||||
-- use for future if base currency id other from '1'
|
||||
IFF(transaction_orders.base_currency_id = '1',
|
||||
transaction_orders.base_tax,
|
||||
-9999999999) AS tax_rm,
|
||||
|
||||
transaction_orders.base_service_charge,
|
||||
-- use for future if base currency id other from '1'
|
||||
IFF(transaction_orders.base_currency_id = '1',
|
||||
transaction_orders.base_service_charge,
|
||||
-9999999999) AS service_charge_rm,
|
||||
|
||||
(value_rm + service_charge_rm + tax_rm) AS total_value_rm,
|
||||
|
||||
transaction_orders.deleted_datetime AS order_deleted_datetime,
|
||||
transaction_orders.updated_datetime AS order_updated_datetime,
|
||||
|
||||
{% for column_name in ["company", "user"] %}
|
||||
CASE
|
||||
WHEN ROW_NUMBER() OVER (PARTITION BY transaction_orders.{{column_name}}_id ORDER BY transaction_orders.created_datetime) = 1 THEN 1
|
||||
ELSE 0
|
||||
END AS is_first_time_{{column_name}},
|
||||
|
||||
CASE
|
||||
WHEN transaction_orders.status = 'COMPLETED'
|
||||
AND
|
||||
MIN(IFF(transaction_orders.status = 'COMPLETED', transaction_orders.created_datetime, NULL))
|
||||
OVER (PARTITION BY transaction_orders.{{column_name}}_id)
|
||||
= transaction_orders.created_datetime
|
||||
THEN 1
|
||||
ELSE 0
|
||||
END AS is_first_time_{{column_name}}_completed,
|
||||
{% endfor %}
|
||||
|
||||
transaction_order_order_status_datetime.order_created_datetime,
|
||||
|
||||
{%- for status in order_status %}
|
||||
transaction_order_order_status_datetime.order_{{status.lower()}}_datetime,
|
||||
{% endfor %}
|
||||
|
||||
'{{ modules.datetime.datetime.now(modules.pytz.timezone("Asia/Kuala_Lumpur")) }}' AS _dbt_ran_datetime
|
||||
|
||||
FROM transaction_orders
|
||||
|
||||
LEFT JOIN transaction_order_order_status_datetime
|
||||
ON (transaction_orders.transaction_order_id = transaction_order_order_status_datetime.transaction_order_id)
|
||||
),
|
||||
|
||||
-- FINAL
|
||||
final__fct_exchange__transaction_orders AS (
|
||||
SELECT
|
||||
-- ids
|
||||
transaction_order_id,
|
||||
booking_id,
|
||||
company_id,
|
||||
user_id,
|
||||
bank_id,
|
||||
base_currency_id,
|
||||
quote_currency_id,
|
||||
|
||||
-- dimensions
|
||||
transaction_type,
|
||||
payment_method,
|
||||
order_status,
|
||||
payment_reference,
|
||||
bill_number,
|
||||
is_first_time_company,
|
||||
is_first_time_company_completed,
|
||||
is_first_time_user,
|
||||
is_first_time_user_completed,
|
||||
|
||||
-- measures
|
||||
base_to_quote_currency_exchange_rate,
|
||||
base_value,
|
||||
base_service_charge,
|
||||
base_tax,
|
||||
|
||||
quote_value,
|
||||
|
||||
value_rm,
|
||||
service_charge_rm,
|
||||
tax_rm,
|
||||
total_value_rm,
|
||||
|
||||
-- date/times
|
||||
order_expired_datetime,
|
||||
order_deleted_datetime,
|
||||
order_updated_datetime,
|
||||
order_created_datetime,
|
||||
order_pending_submission_datetime,
|
||||
order_pending_verification_datetime,
|
||||
order_approved_datetime,
|
||||
order_completed_datetime,
|
||||
order_rejected_datetime,
|
||||
order_suspended_datetime,
|
||||
|
||||
-- metadata
|
||||
_dbt_ran_datetime
|
||||
|
||||
FROM transaction_orders_lists
|
||||
)
|
||||
|
||||
SELECT * FROM final__fct_exchange__transaction_orders
|
||||
@@ -0,0 +1,57 @@
|
||||
--IMPORT
|
||||
WITH user_email_verifications AS (
|
||||
SELECT * FROM {{ ref('stg_exchange__user_email_verifications') }}
|
||||
),
|
||||
|
||||
companies_brg_users AS (
|
||||
SELECT * FROM {{ ref('stg_exchange__companies_brg_users') }}
|
||||
),
|
||||
|
||||
|
||||
--LOGIC
|
||||
user_email_verifications_get_company_id AS (
|
||||
SELECT
|
||||
user_email_verifications.user_email_verification_id,
|
||||
user_email_verifications.user_id,
|
||||
companies_brg_users.company_id,
|
||||
user_email_verifications.email,
|
||||
user_email_verifications.is_sent,
|
||||
user_email_verifications.is_completed,
|
||||
user_email_verifications.created_datetime AS user_email_verification_created_datetime,
|
||||
user_email_verifications.updated_datetime AS user_email_verification_updated_datetime,
|
||||
'{{ modules.datetime.datetime.now(modules.pytz.timezone("Asia/Kuala_Lumpur")) }}' AS _dbt_ran_datetime
|
||||
|
||||
FROM user_email_verifications
|
||||
|
||||
LEFT JOIN companies_brg_users
|
||||
ON (user_email_verifications.user_id = companies_brg_users.user_id)
|
||||
),
|
||||
|
||||
|
||||
--FINAL
|
||||
final__fct_exchange__company_email_verifications AS (
|
||||
SELECT
|
||||
-- ids
|
||||
user_email_verification_id,
|
||||
user_id,
|
||||
company_id,
|
||||
|
||||
-- dimensions
|
||||
email,
|
||||
is_sent,
|
||||
is_completed,
|
||||
|
||||
-- measures
|
||||
|
||||
-- date/times
|
||||
user_email_verification_created_datetime,
|
||||
user_email_verification_updated_datetime,
|
||||
|
||||
-- metadata
|
||||
_dbt_ran_datetime
|
||||
|
||||
FROM user_email_verifications_get_company_id
|
||||
)
|
||||
|
||||
|
||||
SELECT * FROM final__fct_exchange__company_email_verifications
|
||||
Reference in New Issue
Block a user