diff --git a/integration_tests/data/schema_tests/data_test_mutually_exclusive_ranges_multi_partitions.csv b/integration_tests/data/schema_tests/data_test_mutually_exclusive_ranges_multi_partitions.csv new file mode 100644 index 000000000..4f7da2987 --- /dev/null +++ b/integration_tests/data/schema_tests/data_test_mutually_exclusive_ranges_multi_partitions.csv @@ -0,0 +1,9 @@ +subscription_id,region,valid_from,valid_to +1,US,2020-01-01,2020-02-01 +1,US,2020-02-01,2020-03-01 +1,EU,2020-01-01,2020-02-01 +1,EU,2020-02-01,2020-03-01 +2,US,2020-01-01,2020-02-01 +2,US,2020-02-01,2020-03-01 +2,EU,2020-01-01,2020-02-01 +2,EU,2020-02-01,2020-03-01 \ No newline at end of file diff --git a/integration_tests/models/generic_tests/schema.yml b/integration_tests/models/generic_tests/schema.yml index b12e3c7fe..e0d672076 100644 --- a/integration_tests/models/generic_tests/schema.yml +++ b/integration_tests/models/generic_tests/schema.yml @@ -93,6 +93,15 @@ seeds: upper_bound_column: valid_to partition_by: subscription_id zero_length_range_allowed: true + + - name: data_test_mutually_exclusive_ranges_multi_partitions + data_tests: + - dbt_utils.mutually_exclusive_ranges: + lower_bound_column: valid_from + upper_bound_column: valid_to + partition_by: + - subscription_id + - region - name: data_unique_combination_of_columns data_tests: diff --git a/macros/generic_tests/mutually_exclusive_ranges.sql b/macros/generic_tests/mutually_exclusive_ranges.sql index 041788ddb..1b65ec8c2 100644 --- a/macros/generic_tests/mutually_exclusive_ranges.sql +++ b/macros/generic_tests/mutually_exclusive_ranges.sql @@ -29,13 +29,34 @@ ) }} {% endif %} -{% set partition_clause="partition by " ~ partition_by if partition_by else '' %} +{% if partition_by %} + {% if partition_by is string %} + {% set partition_clause = "partition by " ~ partition_by %} + {% elif partition_by is sequence and partition_by is not string and partition_by | length > 0 %} + {% set partition_clause = "partition by " ~ partition_by | join(', ') %} + {% else %} + {% set partition_clause = "" %} + {% endif %} +{% else %} + {% set partition_clause = "" %} +{% endif %} with window_functions as ( select {% if partition_by %} - {{ partition_by }} as partition_by_col, + {% if partition_by is string %} + {{ partition_by }} as partition_by_col, + {% else %} + {% set concat_cols = [] %} + {% for col in partition_by %} + {% do concat_cols.append(col) %} + {% if not loop.last %} + {% do concat_cols.append("'_'") %} + {% endif %} + {% endfor %} + {{ dbt.concat(concat_cols) }} as partition_by_col, + {% endif %} {% endif %} {{ lower_bound_column }} as lower_bound, {{ upper_bound_column }} as upper_bound,