|
17 | 17 |
|
18 | 18 | {%- if test_configuration.seasonality == 'day_of_week' %} |
19 | 19 | {%- set bucket_seasonality_expr = elementary.edr_day_of_week_expression('bucket_end') %} |
| 20 | + {%- set has_seasonality = true %} |
20 | 21 |
|
21 | 22 | {%- elif test_configuration.seasonality == 'hour_of_day' %} |
22 | 23 | {%- set bucket_seasonality_expr = elementary.edr_hour_of_day_expression('bucket_end') %} |
| 24 | + {%- set has_seasonality = true %} |
23 | 25 |
|
24 | 26 | {%- elif test_configuration.seasonality == 'hour_of_week' %} |
25 | 27 | {%- set bucket_seasonality_expr = elementary.edr_hour_of_week_expression('bucket_end') %} |
| 28 | + {%- set has_seasonality = true %} |
26 | 29 |
|
27 | 30 | {%- else %} |
28 | 31 | {%- set bucket_seasonality_expr = elementary.const_as_text('no_seasonality') %} |
| 32 | + {%- set has_seasonality = false %} |
29 | 33 | {%- endif %} |
| 34 | + |
| 35 | + {# Build PARTITION BY clause for window functions. |
| 36 | + Redshift doesn't support constant expressions in PARTITION BY, so we exclude |
| 37 | + bucket_seasonality when it's a constant (i.e., when has_seasonality is false). #} |
| 38 | + {%- set partition_by_keys = "metric_name, full_table_name, column_name, dimension, dimension_value" %} |
| 39 | + {%- if has_seasonality %} |
| 40 | + {%- set partition_by_keys = partition_by_keys ~ ", bucket_seasonality" %} |
| 41 | + {%- endif %} |
| 42 | + |
30 | 43 | {%- set detection_end = elementary.get_detection_end(test_configuration.detection_delay) %} |
31 | 44 | {%- set detection_end_expr = elementary.edr_cast_as_timestamp(elementary.edr_datetime_to_sql(detection_end)) %} |
32 | 45 | {%- set min_bucket_start_expr = elementary.get_trunc_min_bucket_start_expr(detection_end, metric_properties, test_configuration.days_back) %} |
|
182 | 195 | bucket_duration_hours, |
183 | 196 | updated_at, |
184 | 197 | should_exclude_from_training, |
185 | | - avg(case when not should_exclude_from_training then metric_value end) over (partition by metric_name, full_table_name, column_name, dimension, dimension_value, bucket_seasonality order by bucket_end asc rows between unbounded preceding and current row) as training_avg, |
186 | | - {{ elementary.standard_deviation('case when not should_exclude_from_training then metric_value end') }} over (partition by metric_name, full_table_name, column_name, dimension, dimension_value, bucket_seasonality order by bucket_end asc rows between unbounded preceding and current row) as training_stddev, |
187 | | - count(case when not should_exclude_from_training then metric_value end) over (partition by metric_name, full_table_name, column_name, dimension, dimension_value, bucket_seasonality order by bucket_end asc rows between unbounded preceding and current row) as training_set_size, |
188 | | - last_value(case when not should_exclude_from_training then bucket_end end) over (partition by metric_name, full_table_name, column_name, dimension, dimension_value, bucket_seasonality order by bucket_end asc rows between unbounded preceding and current row) training_end, |
189 | | - first_value(case when not should_exclude_from_training then bucket_end end) over (partition by metric_name, full_table_name, column_name, dimension, dimension_value, bucket_seasonality order by bucket_end asc rows between unbounded preceding and current row) as training_start |
| 198 | + avg(case when not should_exclude_from_training then metric_value end) over (partition by {{ partition_by_keys }} order by bucket_end asc rows between unbounded preceding and current row) as training_avg, |
| 199 | + {{ elementary.standard_deviation('case when not should_exclude_from_training then metric_value end') }} over (partition by {{ partition_by_keys }} order by bucket_end asc rows between unbounded preceding and current row) as training_stddev, |
| 200 | + count(case when not should_exclude_from_training then metric_value end) over (partition by {{ partition_by_keys }} order by bucket_end asc rows between unbounded preceding and current row) as training_set_size, |
| 201 | + last_value(case when not should_exclude_from_training then bucket_end end) over (partition by {{ partition_by_keys }} order by bucket_end asc rows between unbounded preceding and current row) training_end, |
| 202 | + first_value(case when not should_exclude_from_training then bucket_end end) over (partition by {{ partition_by_keys }} order by bucket_end asc rows between unbounded preceding and current row) as training_start |
190 | 203 | from grouped_metrics |
191 | 204 | where not is_excluded |
192 | 205 | {{ dbt_utils.group_by(14) }} |
|
0 commit comments