Fixed macro

This commit is contained in:
Joaquin Ossa 2025-01-24 14:17:29 +01:00
parent e4d19b85e8
commit 720185f235
3 changed files with 68 additions and 56 deletions

View file

@ -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 %}

View file

@ -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 %}