From 720185f23566767fbffa16cbf8a05668655f0955 Mon Sep 17 00:00:00 2001 From: Joaquin Ossa Date: Fri, 24 Jan 2025 14:17:29 +0100 Subject: [PATCH] Fixed macro --- macros/calculate_safe_relative_increment.sql | 33 ++------- macros/return_capped_value.sql | 20 ++++++ .../int_mtd_vs_previous_year_metrics.sql | 71 ++++++++++++------- 3 files changed, 68 insertions(+), 56 deletions(-) create mode 100644 macros/return_capped_value.sql diff --git a/macros/calculate_safe_relative_increment.sql b/macros/calculate_safe_relative_increment.sql index 6645136..59ba448 100644 --- a/macros/calculate_safe_relative_increment.sql +++ b/macros/calculate_safe_relative_increment.sql @@ -10,33 +10,8 @@ It ensure safe divide by zero division by applying a nullif function. {% macro calculate_safe_relative_increment( metric, current="current", previous="previous_year" ) %} - -- Metrics that need to be capped between -1 and 1 - {% set capped_metrics = [ - "host_resolution_payment_per_created_booking_ratio", - "revenue_retained_post_resolutions_ratio", - "revenue_retained_ratio", - ] %} - {% if metric in capped_metrics %} - -- Cap current and previous values between -1 and 1 - case - when {{ current }}.{{ metric }} is null - then null - else least(1, greatest(-1, {{ current }}.{{ metric }})) - end as {{ metric }}, - case - when {{ previous }}.{{ metric }} is null - then null - else least(1, greatest(-1, {{ previous }}.{{ metric }})) - end as {{ previous }}_{{ metric }}, - cast(least(1, greatest(-1, {{ current }}.{{ metric }})) as decimal) - / nullif(least(1, greatest(-1, {{ previous }}.{{ metric }})), 0) - - 1 as relative_increment_{{ metric }} - {% else %} - -- No capping applied, default behavior - {{ current }}.{{ metric }}, - {{ previous }}.{{ metric }} as {{ previous }}_{{ metric }}, - cast({{ current }}.{{ metric }} as decimal) - / nullif({{ previous }}.{{ metric }}, 0) - - 1 as relative_increment_{{ metric }} - {% endif %} + {{ current }}.{{ metric }}, + {{ previous }}.{{ metric }} as {{ previous }}_{{ metric }}, + cast({{ current }}.{{ metric }} as decimal) / nullif({{ previous }}.{{ metric }}, 0) + - 1 as relative_increment_{{ metric }} {% endmacro %} diff --git a/macros/return_capped_value.sql b/macros/return_capped_value.sql new file mode 100644 index 0000000..b6d2889 --- /dev/null +++ b/macros/return_capped_value.sql @@ -0,0 +1,20 @@ +/* +This macro caps a given value between a specified bottom and top limit, +returning `NULL` if the input value is `NULL`. + +It uses the `LEAST` and `GREATEST` SQL functions to enforce the caps while +preserving the `NULL` values in the input. + +Parameters: +- `value`: The value to be capped. +- `cap_bottom`: The minimum limit for the value. +- `cap_top`: The maximum limit for the value. + +*/ +{% macro return_capped_value(value, cap_bottom, cap_top) %} + CASE + WHEN {{ value }} IS NULL THEN NULL + ELSE LEAST({{ cap_top }}, GREATEST({{ cap_bottom }}, {{ value }})) + END +{% endmacro %} + diff --git a/models/intermediate/cross/int_mtd_vs_previous_year_metrics.sql b/models/intermediate/cross/int_mtd_vs_previous_year_metrics.sql index bc45c22..231df5e 100644 --- a/models/intermediate/cross/int_mtd_vs_previous_year_metrics.sql +++ b/models/intermediate/cross/int_mtd_vs_previous_year_metrics.sql @@ -289,8 +289,14 @@ with cast(host_resolutions.xero_host_resolution_amount_paid_in_gbp as decimal) / created_bookings.created_bookings as host_resolution_amount_paid_per_created_booking, - cast(host_resolutions.xero_host_resolution_payment_count as decimal) - / created_bookings.created_bookings + {{ + return_capped_value( + "cast(host_resolutions.xero_host_resolution_payment_count as decimal) + / created_bookings.created_bookings", + -1, + 1 + ) + }} as host_resolution_payment_per_created_booking_ratio, -- GUEST REVENUE AND PAYMENTS -- @@ -364,31 +370,42 @@ with + coalesce(invoiced_revenue.xero_waiver_paid_back_to_host_in_gbp, 0), 0 ) as revenue_retained_in_gbp, - nullif( - coalesce(guest_payments.total_guest_payments_in_gbp, 0) - + coalesce(invoiced_revenue.xero_operator_net_fees_in_gbp, 0) - + coalesce(invoiced_revenue.xero_apis_net_fees_in_gbp, 0) - + coalesce(invoiced_revenue.xero_waiver_paid_back_to_host_in_gbp, 0), - 0 - ) / nullif( - coalesce(guest_payments.total_guest_payments_in_gbp, 0) - + coalesce(invoiced_revenue.xero_operator_net_fees_in_gbp, 0) - + coalesce(invoiced_revenue.xero_apis_net_fees_in_gbp, 0), - 0 - ) as revenue_retained_ratio, - nullif( - coalesce(guest_payments.total_guest_payments_in_gbp, 0) - + coalesce(invoiced_revenue.xero_operator_net_fees_in_gbp, 0) - + coalesce(invoiced_revenue.xero_apis_net_fees_in_gbp, 0) - + coalesce(invoiced_revenue.xero_waiver_paid_back_to_host_in_gbp, 0) - + coalesce(host_resolutions.xero_host_resolution_amount_paid_in_gbp, 0), - 0 - ) / nullif( - coalesce(guest_payments.total_guest_payments_in_gbp, 0) - + coalesce(invoiced_revenue.xero_operator_net_fees_in_gbp, 0) - + coalesce(invoiced_revenue.xero_apis_net_fees_in_gbp, 0), - 0 - ) as revenue_retained_post_resolutions_ratio, + {{ + return_capped_value( + "nullif( + coalesce(guest_payments.total_guest_payments_in_gbp, 0) + + coalesce(invoiced_revenue.xero_operator_net_fees_in_gbp, 0) + + coalesce(invoiced_revenue.xero_apis_net_fees_in_gbp, 0) + + coalesce(invoiced_revenue.xero_waiver_paid_back_to_host_in_gbp, 0), + 0 + ) / nullif( + coalesce(guest_payments.total_guest_payments_in_gbp, 0) + + coalesce(invoiced_revenue.xero_operator_net_fees_in_gbp, 0) + + coalesce(invoiced_revenue.xero_apis_net_fees_in_gbp, 0), + 0 + )", + -1, + 1 + )}} as revenue_retained_ratio, + {{ + return_capped_value( + "nullif( + coalesce(guest_payments.total_guest_payments_in_gbp, 0) + + coalesce(invoiced_revenue.xero_operator_net_fees_in_gbp, 0) + + coalesce(invoiced_revenue.xero_apis_net_fees_in_gbp, 0) + + coalesce(invoiced_revenue.xero_waiver_paid_back_to_host_in_gbp, 0) + + coalesce(host_resolutions.xero_host_resolution_amount_paid_in_gbp, 0), + 0 + ) / nullif( + coalesce(guest_payments.total_guest_payments_in_gbp, 0) + + coalesce(invoiced_revenue.xero_operator_net_fees_in_gbp, 0) + + coalesce(invoiced_revenue.xero_apis_net_fees_in_gbp, 0), + 0 + )", + -1, + 1 + ) + }} as revenue_retained_post_resolutions_ratio, -- INCOME RETAINED POST RESOLUTIONS-- nullif(