From 71f220736d1632c8560255ae58b8c921c09f7588 Mon Sep 17 00:00:00 2001 From: Courtney Holcomb Date: Tue, 28 Jan 2025 19:04:58 -0800 Subject: [PATCH] Update snapshots for other SQL engines --- .../test_custom_offset_window__plan0.sql | 34 +- ..._custom_offset_window__plan0_optimized.sql | 20 +- ..._with_granularity_and_date_part__plan0.sql | 34 +- ...ularity_and_date_part__plan0_optimized.sql | 20 +- ...indow_with_multiple_time_spines__plan0.sql | 703 ++++++++++++ ..._multiple_time_spines__plan0_optimized.sql | 87 ++ .../test_custom_offset_window__plan0.sql | 34 +- ..._custom_offset_window__plan0_optimized.sql | 20 +- ..._with_granularity_and_date_part__plan0.sql | 34 +- ...ularity_and_date_part__plan0_optimized.sql | 20 +- ...indow_with_multiple_time_spines__plan0.sql | 703 ++++++++++++ ..._multiple_time_spines__plan0_optimized.sql | 87 ++ .../test_custom_offset_window__plan0.sql | 34 +- ..._custom_offset_window__plan0_optimized.sql | 20 +- ..._with_granularity_and_date_part__plan0.sql | 34 +- ...ularity_and_date_part__plan0_optimized.sql | 20 +- ...indow_with_multiple_time_spines__plan0.sql | 703 ++++++++++++ ..._multiple_time_spines__plan0_optimized.sql | 87 ++ .../test_custom_offset_window__plan0.sql | 34 +- ..._custom_offset_window__plan0_optimized.sql | 20 +- ..._with_granularity_and_date_part__plan0.sql | 34 +- ...ularity_and_date_part__plan0_optimized.sql | 20 +- ...indow_with_multiple_time_spines__plan0.sql | 703 ++++++++++++ ..._multiple_time_spines__plan0_optimized.sql | 87 ++ .../test_custom_offset_window__plan0.sql | 34 +- ..._custom_offset_window__plan0_optimized.sql | 20 +- ..._with_granularity_and_date_part__plan0.sql | 34 +- ...ularity_and_date_part__plan0_optimized.sql | 20 +- ...indow_with_multiple_time_spines__plan0.sql | 703 ++++++++++++ ..._multiple_time_spines__plan0_optimized.sql | 87 ++ .../test_custom_offset_window__plan0.sql | 34 +- ..._custom_offset_window__plan0_optimized.sql | 20 +- ..._with_granularity_and_date_part__plan0.sql | 34 +- ...ularity_and_date_part__plan0_optimized.sql | 20 +- ...indow_with_multiple_time_spines__plan0.sql | 703 ++++++++++++ ..._multiple_time_spines__plan0_optimized.sql | 87 ++ ...custom_grain_in_group_by__query_output.txt | 24 +- ...ustom_granularity_filter__query_output.txt | 5 +- ...y_filter_not_in_group_by__query_output.txt | 1004 +---------------- ...custom_grain_in_group_by__query_output.txt | 24 +- ...ustom_granularity_filter__query_output.txt | 5 +- ...y_filter_not_in_group_by__query_output.txt | 1004 +---------------- ...custom_grain_in_group_by__query_output.txt | 24 +- ...ustom_granularity_filter__query_output.txt | 5 +- ...y_filter_not_in_group_by__query_output.txt | 1004 +---------------- ...custom_grain_in_group_by__query_output.txt | 24 +- ...ustom_granularity_filter__query_output.txt | 5 +- ...y_filter_not_in_group_by__query_output.txt | 1004 +---------------- ...custom_grain_in_group_by__query_output.txt | 24 +- ...ustom_granularity_filter__query_output.txt | 5 +- ...y_filter_not_in_group_by__query_output.txt | 1004 +---------------- ...custom_grain_in_group_by__query_output.txt | 24 +- ...t_window_with_base_grain__query_output.txt | 32 +- ...ith_grains_and_date_part__query_output.txt | 9 +- ...th_matching_custom_grain__query_output.txt | 9 +- ...t_window_with_base_grain__query_output.txt | 32 +- ...ith_grains_and_date_part__query_output.txt | 9 +- ...th_matching_custom_grain__query_output.txt | 9 +- ...t_window_with_base_grain__query_output.txt | 32 +- ...ith_grains_and_date_part__query_output.txt | 9 +- ...th_matching_custom_grain__query_output.txt | 9 +- ...t_window_with_base_grain__query_output.txt | 32 +- ...ith_grains_and_date_part__query_output.txt | 9 +- ...th_matching_custom_grain__query_output.txt | 9 +- ...t_window_with_base_grain__query_output.txt | 32 +- ...ith_grains_and_date_part__query_output.txt | 9 +- ...th_matching_custom_grain__query_output.txt | 9 +- ...t_window_with_base_grain__query_output.txt | 32 +- ...ith_grains_and_date_part__query_output.txt | 9 +- ...th_matching_custom_grain__query_output.txt | 9 +- 70 files changed, 5222 insertions(+), 5655 deletions(-) create mode 100644 tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/BigQuery/test_custom_offset_window_with_multiple_time_spines__plan0.sql create mode 100644 tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/BigQuery/test_custom_offset_window_with_multiple_time_spines__plan0_optimized.sql create mode 100644 tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Databricks/test_custom_offset_window_with_multiple_time_spines__plan0.sql create mode 100644 tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Databricks/test_custom_offset_window_with_multiple_time_spines__plan0_optimized.sql create mode 100644 tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Postgres/test_custom_offset_window_with_multiple_time_spines__plan0.sql create mode 100644 tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Postgres/test_custom_offset_window_with_multiple_time_spines__plan0_optimized.sql create mode 100644 tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Redshift/test_custom_offset_window_with_multiple_time_spines__plan0.sql create mode 100644 tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Redshift/test_custom_offset_window_with_multiple_time_spines__plan0_optimized.sql create mode 100644 tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Snowflake/test_custom_offset_window_with_multiple_time_spines__plan0.sql create mode 100644 tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Snowflake/test_custom_offset_window_with_multiple_time_spines__plan0_optimized.sql create mode 100644 tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Trino/test_custom_offset_window_with_multiple_time_spines__plan0.sql create mode 100644 tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Trino/test_custom_offset_window_with_multiple_time_spines__plan0_optimized.sql diff --git a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/BigQuery/test_custom_offset_window__plan0.sql b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/BigQuery/test_custom_offset_window__plan0.sql index ddd0146596..74fb4a1843 100644 --- a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/BigQuery/test_custom_offset_window__plan0.sql +++ b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/BigQuery/test_custom_offset_window__plan0.sql @@ -137,28 +137,18 @@ FROM ( WITH cte_2 AS ( -- Get Custom Granularity Bounds SELECT - time_spine_src_28006.ds AS ds__day - , DATETIME_TRUNC(time_spine_src_28006.ds, isoweek) AS ds__week - , DATETIME_TRUNC(time_spine_src_28006.ds, month) AS ds__month - , DATETIME_TRUNC(time_spine_src_28006.ds, quarter) AS ds__quarter - , DATETIME_TRUNC(time_spine_src_28006.ds, year) AS ds__year - , EXTRACT(year FROM time_spine_src_28006.ds) AS ds__extract_year - , EXTRACT(quarter FROM time_spine_src_28006.ds) AS ds__extract_quarter - , EXTRACT(month FROM time_spine_src_28006.ds) AS ds__extract_month - , EXTRACT(day FROM time_spine_src_28006.ds) AS ds__extract_day - , IF(EXTRACT(dayofweek FROM time_spine_src_28006.ds) = 1, 7, EXTRACT(dayofweek FROM time_spine_src_28006.ds) - 1) AS ds__extract_dow - , EXTRACT(dayofyear FROM time_spine_src_28006.ds) AS ds__extract_doy - , time_spine_src_28006.martian_day AS ds__martian_day + subq_6.ds__day + , subq_6.ds__martian_day , FIRST_VALUE(subq_6.ds__day) OVER ( PARTITION BY subq_6.ds__martian_day ORDER BY subq_6.ds__day ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) AS ds__martian_day__first_value + ) AS ds__day__first_value , LAST_VALUE(subq_6.ds__day) OVER ( PARTITION BY subq_6.ds__martian_day ORDER BY subq_6.ds__day ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) AS ds__martian_day__last_value + ) AS ds__day__last_value , ROW_NUMBER() OVER ( PARTITION BY subq_6.ds__martian_day ORDER BY subq_6.ds__day @@ -185,8 +175,8 @@ FROM ( SELECT cte_2.ds__day AS ds__day , CASE - WHEN DATE_ADD(CAST(subq_8.ds__martian_day__first_value__lead AS DATETIME), INTERVAL cte_2.ds__day__row_number - 1 day) <= subq_8.ds__martian_day__last_value__lead - THEN DATE_ADD(CAST(subq_8.ds__martian_day__first_value__lead AS DATETIME), INTERVAL cte_2.ds__day__row_number - 1 day) + WHEN DATE_ADD(CAST(subq_8.ds__day__first_value__lead AS DATETIME), INTERVAL cte_2.ds__day__row_number - 1 day) <= subq_8.ds__day__last_value__lead + THEN DATE_ADD(CAST(subq_8.ds__day__first_value__lead AS DATETIME), INTERVAL cte_2.ds__day__row_number - 1 day) ELSE NULL END AS ds__day__lead FROM cte_2 cte_2 @@ -194,19 +184,19 @@ FROM ( -- Offset Custom Granularity Bounds SELECT subq_7.ds__martian_day - , LEAD(subq_7.ds__martian_day__first_value, 1) OVER (ORDER BY subq_7.ds__martian_day) AS ds__martian_day__first_value__lead - , LEAD(subq_7.ds__martian_day__last_value, 1) OVER (ORDER BY subq_7.ds__martian_day) AS ds__martian_day__last_value__lead + , LEAD(subq_7.ds__day__first_value, 1) OVER (ORDER BY subq_7.ds__martian_day) AS ds__day__first_value__lead + , LEAD(subq_7.ds__day__last_value, 1) OVER (ORDER BY subq_7.ds__martian_day) AS ds__day__last_value__lead FROM ( -- Get Unique Rows for Custom Granularity Bounds SELECT cte_2.ds__martian_day - , cte_2.ds__martian_day__first_value - , cte_2.ds__martian_day__last_value + , cte_2.ds__day__first_value + , cte_2.ds__day__last_value FROM cte_2 cte_2 GROUP BY ds__martian_day - , ds__martian_day__first_value - , ds__martian_day__last_value + , ds__day__first_value + , ds__day__last_value ) subq_7 ) subq_8 ON diff --git a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/BigQuery/test_custom_offset_window__plan0_optimized.sql b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/BigQuery/test_custom_offset_window__plan0_optimized.sql index 8aee757d86..eaf09e433b 100644 --- a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/BigQuery/test_custom_offset_window__plan0_optimized.sql +++ b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/BigQuery/test_custom_offset_window__plan0_optimized.sql @@ -26,12 +26,12 @@ FROM ( PARTITION BY martian_day ORDER BY ds ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) AS ds__martian_day__first_value + ) AS ds__day__first_value , LAST_VALUE(ds) OVER ( PARTITION BY martian_day ORDER BY ds ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) AS ds__martian_day__last_value + ) AS ds__day__last_value , ROW_NUMBER() OVER ( PARTITION BY martian_day ORDER BY ds @@ -42,8 +42,8 @@ FROM ( SELECT cte_6.ds__day AS ds__day , CASE - WHEN DATE_ADD(CAST(subq_24.ds__martian_day__first_value__lead AS DATETIME), INTERVAL cte_6.ds__day__row_number - 1 day) <= subq_24.ds__martian_day__last_value__lead - THEN DATE_ADD(CAST(subq_24.ds__martian_day__first_value__lead AS DATETIME), INTERVAL cte_6.ds__day__row_number - 1 day) + WHEN DATE_ADD(CAST(subq_24.ds__day__first_value__lead AS DATETIME), INTERVAL cte_6.ds__day__row_number - 1 day) <= subq_24.ds__day__last_value__lead + THEN DATE_ADD(CAST(subq_24.ds__day__first_value__lead AS DATETIME), INTERVAL cte_6.ds__day__row_number - 1 day) ELSE NULL END AS ds__day__lead FROM cte_6 cte_6 @@ -51,19 +51,19 @@ FROM ( -- Offset Custom Granularity Bounds SELECT ds__martian_day - , LEAD(ds__martian_day__first_value, 1) OVER (ORDER BY ds__martian_day) AS ds__martian_day__first_value__lead - , LEAD(ds__martian_day__last_value, 1) OVER (ORDER BY ds__martian_day) AS ds__martian_day__last_value__lead + , LEAD(ds__day__first_value, 1) OVER (ORDER BY ds__martian_day) AS ds__day__first_value__lead + , LEAD(ds__day__last_value, 1) OVER (ORDER BY ds__martian_day) AS ds__day__last_value__lead FROM ( -- Get Unique Rows for Custom Granularity Bounds SELECT ds__martian_day - , ds__martian_day__first_value - , ds__martian_day__last_value + , ds__day__first_value + , ds__day__last_value FROM cte_6 cte_6 GROUP BY ds__martian_day - , ds__martian_day__first_value - , ds__martian_day__last_value + , ds__day__first_value + , ds__day__last_value ) subq_23 ) subq_24 ON diff --git a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/BigQuery/test_custom_offset_window_with_granularity_and_date_part__plan0.sql b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/BigQuery/test_custom_offset_window_with_granularity_and_date_part__plan0.sql index 6ffcf49718..77936e0048 100644 --- a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/BigQuery/test_custom_offset_window_with_granularity_and_date_part__plan0.sql +++ b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/BigQuery/test_custom_offset_window_with_granularity_and_date_part__plan0.sql @@ -151,28 +151,18 @@ FROM ( WITH cte_2 AS ( -- Get Custom Granularity Bounds SELECT - time_spine_src_28006.ds AS ds__day - , DATETIME_TRUNC(time_spine_src_28006.ds, isoweek) AS ds__week - , DATETIME_TRUNC(time_spine_src_28006.ds, month) AS ds__month - , DATETIME_TRUNC(time_spine_src_28006.ds, quarter) AS ds__quarter - , DATETIME_TRUNC(time_spine_src_28006.ds, year) AS ds__year - , EXTRACT(year FROM time_spine_src_28006.ds) AS ds__extract_year - , EXTRACT(quarter FROM time_spine_src_28006.ds) AS ds__extract_quarter - , EXTRACT(month FROM time_spine_src_28006.ds) AS ds__extract_month - , EXTRACT(day FROM time_spine_src_28006.ds) AS ds__extract_day - , IF(EXTRACT(dayofweek FROM time_spine_src_28006.ds) = 1, 7, EXTRACT(dayofweek FROM time_spine_src_28006.ds) - 1) AS ds__extract_dow - , EXTRACT(dayofyear FROM time_spine_src_28006.ds) AS ds__extract_doy - , time_spine_src_28006.martian_day AS ds__martian_day + subq_6.ds__day + , subq_6.ds__martian_day , FIRST_VALUE(subq_6.ds__day) OVER ( PARTITION BY subq_6.ds__martian_day ORDER BY subq_6.ds__day ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) AS ds__martian_day__first_value + ) AS ds__day__first_value , LAST_VALUE(subq_6.ds__day) OVER ( PARTITION BY subq_6.ds__martian_day ORDER BY subq_6.ds__day ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) AS ds__martian_day__last_value + ) AS ds__day__last_value , ROW_NUMBER() OVER ( PARTITION BY subq_6.ds__martian_day ORDER BY subq_6.ds__day @@ -199,8 +189,8 @@ FROM ( SELECT cte_2.ds__day AS ds__day , CASE - WHEN DATE_ADD(CAST(subq_8.ds__martian_day__first_value__lead AS DATETIME), INTERVAL cte_2.ds__day__row_number - 1 day) <= subq_8.ds__martian_day__last_value__lead - THEN DATE_ADD(CAST(subq_8.ds__martian_day__first_value__lead AS DATETIME), INTERVAL cte_2.ds__day__row_number - 1 day) + WHEN DATE_ADD(CAST(subq_8.ds__day__first_value__lead AS DATETIME), INTERVAL cte_2.ds__day__row_number - 1 day) <= subq_8.ds__day__last_value__lead + THEN DATE_ADD(CAST(subq_8.ds__day__first_value__lead AS DATETIME), INTERVAL cte_2.ds__day__row_number - 1 day) ELSE NULL END AS ds__day__lead FROM cte_2 cte_2 @@ -208,19 +198,19 @@ FROM ( -- Offset Custom Granularity Bounds SELECT subq_7.ds__martian_day - , LEAD(subq_7.ds__martian_day__first_value, 1) OVER (ORDER BY subq_7.ds__martian_day) AS ds__martian_day__first_value__lead - , LEAD(subq_7.ds__martian_day__last_value, 1) OVER (ORDER BY subq_7.ds__martian_day) AS ds__martian_day__last_value__lead + , LEAD(subq_7.ds__day__first_value, 1) OVER (ORDER BY subq_7.ds__martian_day) AS ds__day__first_value__lead + , LEAD(subq_7.ds__day__last_value, 1) OVER (ORDER BY subq_7.ds__martian_day) AS ds__day__last_value__lead FROM ( -- Get Unique Rows for Custom Granularity Bounds SELECT cte_2.ds__martian_day - , cte_2.ds__martian_day__first_value - , cte_2.ds__martian_day__last_value + , cte_2.ds__day__first_value + , cte_2.ds__day__last_value FROM cte_2 cte_2 GROUP BY ds__martian_day - , ds__martian_day__first_value - , ds__martian_day__last_value + , ds__day__first_value + , ds__day__last_value ) subq_7 ) subq_8 ON diff --git a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/BigQuery/test_custom_offset_window_with_granularity_and_date_part__plan0_optimized.sql b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/BigQuery/test_custom_offset_window_with_granularity_and_date_part__plan0_optimized.sql index 56cd5d05a4..a986972c14 100644 --- a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/BigQuery/test_custom_offset_window_with_granularity_and_date_part__plan0_optimized.sql +++ b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/BigQuery/test_custom_offset_window_with_granularity_and_date_part__plan0_optimized.sql @@ -31,12 +31,12 @@ FROM ( PARTITION BY martian_day ORDER BY ds ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) AS ds__martian_day__first_value + ) AS ds__day__first_value , LAST_VALUE(ds) OVER ( PARTITION BY martian_day ORDER BY ds ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) AS ds__martian_day__last_value + ) AS ds__day__last_value , ROW_NUMBER() OVER ( PARTITION BY martian_day ORDER BY ds @@ -47,8 +47,8 @@ FROM ( SELECT cte_6.ds__day AS ds__day , CASE - WHEN DATE_ADD(CAST(subq_25.ds__martian_day__first_value__lead AS DATETIME), INTERVAL cte_6.ds__day__row_number - 1 day) <= subq_25.ds__martian_day__last_value__lead - THEN DATE_ADD(CAST(subq_25.ds__martian_day__first_value__lead AS DATETIME), INTERVAL cte_6.ds__day__row_number - 1 day) + WHEN DATE_ADD(CAST(subq_25.ds__day__first_value__lead AS DATETIME), INTERVAL cte_6.ds__day__row_number - 1 day) <= subq_25.ds__day__last_value__lead + THEN DATE_ADD(CAST(subq_25.ds__day__first_value__lead AS DATETIME), INTERVAL cte_6.ds__day__row_number - 1 day) ELSE NULL END AS ds__day__lead FROM cte_6 cte_6 @@ -56,19 +56,19 @@ FROM ( -- Offset Custom Granularity Bounds SELECT ds__martian_day - , LEAD(ds__martian_day__first_value, 1) OVER (ORDER BY ds__martian_day) AS ds__martian_day__first_value__lead - , LEAD(ds__martian_day__last_value, 1) OVER (ORDER BY ds__martian_day) AS ds__martian_day__last_value__lead + , LEAD(ds__day__first_value, 1) OVER (ORDER BY ds__martian_day) AS ds__day__first_value__lead + , LEAD(ds__day__last_value, 1) OVER (ORDER BY ds__martian_day) AS ds__day__last_value__lead FROM ( -- Get Unique Rows for Custom Granularity Bounds SELECT ds__martian_day - , ds__martian_day__first_value - , ds__martian_day__last_value + , ds__day__first_value + , ds__day__last_value FROM cte_6 cte_6 GROUP BY ds__martian_day - , ds__martian_day__first_value - , ds__martian_day__last_value + , ds__day__first_value + , ds__day__last_value ) subq_24 ) subq_25 ON diff --git a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/BigQuery/test_custom_offset_window_with_multiple_time_spines__plan0.sql b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/BigQuery/test_custom_offset_window_with_multiple_time_spines__plan0.sql new file mode 100644 index 0000000000..965b934695 --- /dev/null +++ b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/BigQuery/test_custom_offset_window_with_multiple_time_spines__plan0.sql @@ -0,0 +1,703 @@ +test_name: test_custom_offset_window_with_multiple_time_spines +test_filename: test_custom_granularity.py +sql_engine: BigQuery +--- +-- Compute Metrics via Expressions +SELECT + subq_17.metric_time__hour + , archived_users AS archived_users_offset_1_martian_day +FROM ( + -- Compute Metrics via Expressions + SELECT + subq_16.metric_time__hour + , subq_16.archived_users + FROM ( + -- Aggregate Measures + SELECT + subq_15.metric_time__hour + , SUM(subq_15.archived_users) AS archived_users + FROM ( + -- Pass Only Elements: ['archived_users', 'metric_time__hour'] + SELECT + subq_14.metric_time__hour + , subq_14.archived_users + FROM ( + -- Join to Time Spine Dataset + SELECT + subq_13.metric_time__hour AS metric_time__hour + , subq_6.ds__day AS ds__day + , subq_6.ds__week AS ds__week + , subq_6.ds__month AS ds__month + , subq_6.ds__quarter AS ds__quarter + , subq_6.ds__year AS ds__year + , subq_6.ds__extract_year AS ds__extract_year + , subq_6.ds__extract_quarter AS ds__extract_quarter + , subq_6.ds__extract_month AS ds__extract_month + , subq_6.ds__extract_day AS ds__extract_day + , subq_6.ds__extract_dow AS ds__extract_dow + , subq_6.ds__extract_doy AS ds__extract_doy + , subq_6.created_at__day AS created_at__day + , subq_6.created_at__week AS created_at__week + , subq_6.created_at__month AS created_at__month + , subq_6.created_at__quarter AS created_at__quarter + , subq_6.created_at__year AS created_at__year + , subq_6.created_at__extract_year AS created_at__extract_year + , subq_6.created_at__extract_quarter AS created_at__extract_quarter + , subq_6.created_at__extract_month AS created_at__extract_month + , subq_6.created_at__extract_day AS created_at__extract_day + , subq_6.created_at__extract_dow AS created_at__extract_dow + , subq_6.created_at__extract_doy AS created_at__extract_doy + , subq_6.ds_partitioned__day AS ds_partitioned__day + , subq_6.ds_partitioned__week AS ds_partitioned__week + , subq_6.ds_partitioned__month AS ds_partitioned__month + , subq_6.ds_partitioned__quarter AS ds_partitioned__quarter + , subq_6.ds_partitioned__year AS ds_partitioned__year + , subq_6.ds_partitioned__extract_year AS ds_partitioned__extract_year + , subq_6.ds_partitioned__extract_quarter AS ds_partitioned__extract_quarter + , subq_6.ds_partitioned__extract_month AS ds_partitioned__extract_month + , subq_6.ds_partitioned__extract_day AS ds_partitioned__extract_day + , subq_6.ds_partitioned__extract_dow AS ds_partitioned__extract_dow + , subq_6.ds_partitioned__extract_doy AS ds_partitioned__extract_doy + , subq_6.last_profile_edit_ts__millisecond AS last_profile_edit_ts__millisecond + , subq_6.last_profile_edit_ts__second AS last_profile_edit_ts__second + , subq_6.last_profile_edit_ts__minute AS last_profile_edit_ts__minute + , subq_6.last_profile_edit_ts__hour AS last_profile_edit_ts__hour + , subq_6.last_profile_edit_ts__day AS last_profile_edit_ts__day + , subq_6.last_profile_edit_ts__week AS last_profile_edit_ts__week + , subq_6.last_profile_edit_ts__month AS last_profile_edit_ts__month + , subq_6.last_profile_edit_ts__quarter AS last_profile_edit_ts__quarter + , subq_6.last_profile_edit_ts__year AS last_profile_edit_ts__year + , subq_6.last_profile_edit_ts__extract_year AS last_profile_edit_ts__extract_year + , subq_6.last_profile_edit_ts__extract_quarter AS last_profile_edit_ts__extract_quarter + , subq_6.last_profile_edit_ts__extract_month AS last_profile_edit_ts__extract_month + , subq_6.last_profile_edit_ts__extract_day AS last_profile_edit_ts__extract_day + , subq_6.last_profile_edit_ts__extract_dow AS last_profile_edit_ts__extract_dow + , subq_6.last_profile_edit_ts__extract_doy AS last_profile_edit_ts__extract_doy + , subq_6.bio_added_ts__second AS bio_added_ts__second + , subq_6.bio_added_ts__minute AS bio_added_ts__minute + , subq_6.bio_added_ts__hour AS bio_added_ts__hour + , subq_6.bio_added_ts__day AS bio_added_ts__day + , subq_6.bio_added_ts__week AS bio_added_ts__week + , subq_6.bio_added_ts__month AS bio_added_ts__month + , subq_6.bio_added_ts__quarter AS bio_added_ts__quarter + , subq_6.bio_added_ts__year AS bio_added_ts__year + , subq_6.bio_added_ts__extract_year AS bio_added_ts__extract_year + , subq_6.bio_added_ts__extract_quarter AS bio_added_ts__extract_quarter + , subq_6.bio_added_ts__extract_month AS bio_added_ts__extract_month + , subq_6.bio_added_ts__extract_day AS bio_added_ts__extract_day + , subq_6.bio_added_ts__extract_dow AS bio_added_ts__extract_dow + , subq_6.bio_added_ts__extract_doy AS bio_added_ts__extract_doy + , subq_6.last_login_ts__minute AS last_login_ts__minute + , subq_6.last_login_ts__hour AS last_login_ts__hour + , subq_6.last_login_ts__day AS last_login_ts__day + , subq_6.last_login_ts__week AS last_login_ts__week + , subq_6.last_login_ts__month AS last_login_ts__month + , subq_6.last_login_ts__quarter AS last_login_ts__quarter + , subq_6.last_login_ts__year AS last_login_ts__year + , subq_6.last_login_ts__extract_year AS last_login_ts__extract_year + , subq_6.last_login_ts__extract_quarter AS last_login_ts__extract_quarter + , subq_6.last_login_ts__extract_month AS last_login_ts__extract_month + , subq_6.last_login_ts__extract_day AS last_login_ts__extract_day + , subq_6.last_login_ts__extract_dow AS last_login_ts__extract_dow + , subq_6.last_login_ts__extract_doy AS last_login_ts__extract_doy + , subq_6.archived_at__hour AS archived_at__hour + , subq_6.archived_at__day AS archived_at__day + , subq_6.archived_at__week AS archived_at__week + , subq_6.archived_at__month AS archived_at__month + , subq_6.archived_at__quarter AS archived_at__quarter + , subq_6.archived_at__year AS archived_at__year + , subq_6.archived_at__extract_year AS archived_at__extract_year + , subq_6.archived_at__extract_quarter AS archived_at__extract_quarter + , subq_6.archived_at__extract_month AS archived_at__extract_month + , subq_6.archived_at__extract_day AS archived_at__extract_day + , subq_6.archived_at__extract_dow AS archived_at__extract_dow + , subq_6.archived_at__extract_doy AS archived_at__extract_doy + , subq_6.user__ds__day AS user__ds__day + , subq_6.user__ds__week AS user__ds__week + , subq_6.user__ds__month AS user__ds__month + , subq_6.user__ds__quarter AS user__ds__quarter + , subq_6.user__ds__year AS user__ds__year + , subq_6.user__ds__extract_year AS user__ds__extract_year + , subq_6.user__ds__extract_quarter AS user__ds__extract_quarter + , subq_6.user__ds__extract_month AS user__ds__extract_month + , subq_6.user__ds__extract_day AS user__ds__extract_day + , subq_6.user__ds__extract_dow AS user__ds__extract_dow + , subq_6.user__ds__extract_doy AS user__ds__extract_doy + , subq_6.user__created_at__day AS user__created_at__day + , subq_6.user__created_at__week AS user__created_at__week + , subq_6.user__created_at__month AS user__created_at__month + , subq_6.user__created_at__quarter AS user__created_at__quarter + , subq_6.user__created_at__year AS user__created_at__year + , subq_6.user__created_at__extract_year AS user__created_at__extract_year + , subq_6.user__created_at__extract_quarter AS user__created_at__extract_quarter + , subq_6.user__created_at__extract_month AS user__created_at__extract_month + , subq_6.user__created_at__extract_day AS user__created_at__extract_day + , subq_6.user__created_at__extract_dow AS user__created_at__extract_dow + , subq_6.user__created_at__extract_doy AS user__created_at__extract_doy + , subq_6.user__ds_partitioned__day AS user__ds_partitioned__day + , subq_6.user__ds_partitioned__week AS user__ds_partitioned__week + , subq_6.user__ds_partitioned__month AS user__ds_partitioned__month + , subq_6.user__ds_partitioned__quarter AS user__ds_partitioned__quarter + , subq_6.user__ds_partitioned__year AS user__ds_partitioned__year + , subq_6.user__ds_partitioned__extract_year AS user__ds_partitioned__extract_year + , subq_6.user__ds_partitioned__extract_quarter AS user__ds_partitioned__extract_quarter + , subq_6.user__ds_partitioned__extract_month AS user__ds_partitioned__extract_month + , subq_6.user__ds_partitioned__extract_day AS user__ds_partitioned__extract_day + , subq_6.user__ds_partitioned__extract_dow AS user__ds_partitioned__extract_dow + , subq_6.user__ds_partitioned__extract_doy AS user__ds_partitioned__extract_doy + , subq_6.user__last_profile_edit_ts__millisecond AS user__last_profile_edit_ts__millisecond + , subq_6.user__last_profile_edit_ts__second AS user__last_profile_edit_ts__second + , subq_6.user__last_profile_edit_ts__minute AS user__last_profile_edit_ts__minute + , subq_6.user__last_profile_edit_ts__hour AS user__last_profile_edit_ts__hour + , subq_6.user__last_profile_edit_ts__day AS user__last_profile_edit_ts__day + , subq_6.user__last_profile_edit_ts__week AS user__last_profile_edit_ts__week + , subq_6.user__last_profile_edit_ts__month AS user__last_profile_edit_ts__month + , subq_6.user__last_profile_edit_ts__quarter AS user__last_profile_edit_ts__quarter + , subq_6.user__last_profile_edit_ts__year AS user__last_profile_edit_ts__year + , subq_6.user__last_profile_edit_ts__extract_year AS user__last_profile_edit_ts__extract_year + , subq_6.user__last_profile_edit_ts__extract_quarter AS user__last_profile_edit_ts__extract_quarter + , subq_6.user__last_profile_edit_ts__extract_month AS user__last_profile_edit_ts__extract_month + , subq_6.user__last_profile_edit_ts__extract_day AS user__last_profile_edit_ts__extract_day + , subq_6.user__last_profile_edit_ts__extract_dow AS user__last_profile_edit_ts__extract_dow + , subq_6.user__last_profile_edit_ts__extract_doy AS user__last_profile_edit_ts__extract_doy + , subq_6.user__bio_added_ts__second AS user__bio_added_ts__second + , subq_6.user__bio_added_ts__minute AS user__bio_added_ts__minute + , subq_6.user__bio_added_ts__hour AS user__bio_added_ts__hour + , subq_6.user__bio_added_ts__day AS user__bio_added_ts__day + , subq_6.user__bio_added_ts__week AS user__bio_added_ts__week + , subq_6.user__bio_added_ts__month AS user__bio_added_ts__month + , subq_6.user__bio_added_ts__quarter AS user__bio_added_ts__quarter + , subq_6.user__bio_added_ts__year AS user__bio_added_ts__year + , subq_6.user__bio_added_ts__extract_year AS user__bio_added_ts__extract_year + , subq_6.user__bio_added_ts__extract_quarter AS user__bio_added_ts__extract_quarter + , subq_6.user__bio_added_ts__extract_month AS user__bio_added_ts__extract_month + , subq_6.user__bio_added_ts__extract_day AS user__bio_added_ts__extract_day + , subq_6.user__bio_added_ts__extract_dow AS user__bio_added_ts__extract_dow + , subq_6.user__bio_added_ts__extract_doy AS user__bio_added_ts__extract_doy + , subq_6.user__last_login_ts__minute AS user__last_login_ts__minute + , subq_6.user__last_login_ts__hour AS user__last_login_ts__hour + , subq_6.user__last_login_ts__day AS user__last_login_ts__day + , subq_6.user__last_login_ts__week AS user__last_login_ts__week + , subq_6.user__last_login_ts__month AS user__last_login_ts__month + , subq_6.user__last_login_ts__quarter AS user__last_login_ts__quarter + , subq_6.user__last_login_ts__year AS user__last_login_ts__year + , subq_6.user__last_login_ts__extract_year AS user__last_login_ts__extract_year + , subq_6.user__last_login_ts__extract_quarter AS user__last_login_ts__extract_quarter + , subq_6.user__last_login_ts__extract_month AS user__last_login_ts__extract_month + , subq_6.user__last_login_ts__extract_day AS user__last_login_ts__extract_day + , subq_6.user__last_login_ts__extract_dow AS user__last_login_ts__extract_dow + , subq_6.user__last_login_ts__extract_doy AS user__last_login_ts__extract_doy + , subq_6.user__archived_at__hour AS user__archived_at__hour + , subq_6.user__archived_at__day AS user__archived_at__day + , subq_6.user__archived_at__week AS user__archived_at__week + , subq_6.user__archived_at__month AS user__archived_at__month + , subq_6.user__archived_at__quarter AS user__archived_at__quarter + , subq_6.user__archived_at__year AS user__archived_at__year + , subq_6.user__archived_at__extract_year AS user__archived_at__extract_year + , subq_6.user__archived_at__extract_quarter AS user__archived_at__extract_quarter + , subq_6.user__archived_at__extract_month AS user__archived_at__extract_month + , subq_6.user__archived_at__extract_day AS user__archived_at__extract_day + , subq_6.user__archived_at__extract_dow AS user__archived_at__extract_dow + , subq_6.user__archived_at__extract_doy AS user__archived_at__extract_doy + , subq_6.metric_time__day AS metric_time__day + , subq_6.metric_time__week AS metric_time__week + , subq_6.metric_time__month AS metric_time__month + , subq_6.metric_time__quarter AS metric_time__quarter + , subq_6.metric_time__year AS metric_time__year + , subq_6.metric_time__extract_year AS metric_time__extract_year + , subq_6.metric_time__extract_quarter AS metric_time__extract_quarter + , subq_6.metric_time__extract_month AS metric_time__extract_month + , subq_6.metric_time__extract_day AS metric_time__extract_day + , subq_6.metric_time__extract_dow AS metric_time__extract_dow + , subq_6.metric_time__extract_doy AS metric_time__extract_doy + , subq_6.user AS user + , subq_6.home_state AS home_state + , subq_6.user__home_state AS user__home_state + , subq_6.archived_users AS archived_users + FROM ( + -- Pass Only Elements: ['ts__hour', 'metric_time__hour'] + SELECT + subq_12.ts__hour + , subq_12.metric_time__hour + FROM ( + -- Apply Requested Granularities + SELECT + subq_11.ts__hour + , subq_11.ts__hour__lead AS metric_time__hour + FROM ( + -- Offset Base Granularity By Custom Granularity Period(s) + WITH cte_2 AS ( + -- Get Custom Granularity Bounds + SELECT + subq_8.ts__hour AS ts__hour + , subq_7.ds__martian_day AS ds__martian_day + , FIRST_VALUE(subq_8.ts__hour) OVER ( + PARTITION BY subq_7.ds__martian_day + ORDER BY subq_8.ts__hour + ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING + ) AS ts__hour__first_value + , LAST_VALUE(subq_8.ts__hour) OVER ( + PARTITION BY subq_7.ds__martian_day + ORDER BY subq_8.ts__hour + ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING + ) AS ts__hour__last_value + , ROW_NUMBER() OVER ( + PARTITION BY subq_7.ds__martian_day + ORDER BY subq_8.ts__hour + ) AS ts__hour__row_number + FROM ( + -- Read From Time Spine 'mf_time_spine' + SELECT + time_spine_src_28006.ds AS ds__day + , DATETIME_TRUNC(time_spine_src_28006.ds, isoweek) AS ds__week + , DATETIME_TRUNC(time_spine_src_28006.ds, month) AS ds__month + , DATETIME_TRUNC(time_spine_src_28006.ds, quarter) AS ds__quarter + , DATETIME_TRUNC(time_spine_src_28006.ds, year) AS ds__year + , EXTRACT(year FROM time_spine_src_28006.ds) AS ds__extract_year + , EXTRACT(quarter FROM time_spine_src_28006.ds) AS ds__extract_quarter + , EXTRACT(month FROM time_spine_src_28006.ds) AS ds__extract_month + , EXTRACT(day FROM time_spine_src_28006.ds) AS ds__extract_day + , IF(EXTRACT(dayofweek FROM time_spine_src_28006.ds) = 1, 7, EXTRACT(dayofweek FROM time_spine_src_28006.ds) - 1) AS ds__extract_dow + , EXTRACT(dayofyear FROM time_spine_src_28006.ds) AS ds__extract_doy + , time_spine_src_28006.martian_day AS ds__martian_day + FROM ***************************.mf_time_spine time_spine_src_28006 + ) subq_7 + INNER JOIN ( + -- Read From Time Spine 'mf_time_spine_hour' + SELECT + time_spine_src_28005.ts AS ts__hour + , DATETIME_TRUNC(time_spine_src_28005.ts, day) AS ts__day + , DATETIME_TRUNC(time_spine_src_28005.ts, isoweek) AS ts__week + , DATETIME_TRUNC(time_spine_src_28005.ts, month) AS ts__month + , DATETIME_TRUNC(time_spine_src_28005.ts, quarter) AS ts__quarter + , DATETIME_TRUNC(time_spine_src_28005.ts, year) AS ts__year + , EXTRACT(year FROM time_spine_src_28005.ts) AS ts__extract_year + , EXTRACT(quarter FROM time_spine_src_28005.ts) AS ts__extract_quarter + , EXTRACT(month FROM time_spine_src_28005.ts) AS ts__extract_month + , EXTRACT(day FROM time_spine_src_28005.ts) AS ts__extract_day + , IF(EXTRACT(dayofweek FROM time_spine_src_28005.ts) = 1, 7, EXTRACT(dayofweek FROM time_spine_src_28005.ts) - 1) AS ts__extract_dow + , EXTRACT(dayofyear FROM time_spine_src_28005.ts) AS ts__extract_doy + FROM ***************************.mf_time_spine_hour time_spine_src_28005 + ) subq_8 + ON + subq_7.ds__day = subq_8.ts__day + ) + + SELECT + cte_2.ts__hour AS ts__hour + , CASE + WHEN DATE_ADD(CAST(subq_10.ts__hour__first_value__lead AS DATETIME), INTERVAL cte_2.ts__hour__row_number - 1 hour) <= subq_10.ts__hour__last_value__lead + THEN DATE_ADD(CAST(subq_10.ts__hour__first_value__lead AS DATETIME), INTERVAL cte_2.ts__hour__row_number - 1 hour) + ELSE NULL + END AS ts__hour__lead + FROM cte_2 cte_2 + INNER JOIN ( + -- Offset Custom Granularity Bounds + SELECT + subq_9.ds__martian_day + , LEAD(subq_9.ts__hour__first_value, 1) OVER (ORDER BY subq_9.ds__martian_day) AS ts__hour__first_value__lead + , LEAD(subq_9.ts__hour__last_value, 1) OVER (ORDER BY subq_9.ds__martian_day) AS ts__hour__last_value__lead + FROM ( + -- Get Unique Rows for Custom Granularity Bounds + SELECT + cte_2.ds__martian_day + , cte_2.ts__hour__first_value + , cte_2.ts__hour__last_value + FROM cte_2 cte_2 + GROUP BY + ds__martian_day + , ts__hour__first_value + , ts__hour__last_value + ) subq_9 + ) subq_10 + ON + cte_2.ds__martian_day = subq_10.ds__martian_day + ) subq_11 + ) subq_12 + ) subq_13 + INNER JOIN ( + -- Metric Time Dimension 'archived_at' + SELECT + subq_5.ds__day + , subq_5.ds__week + , subq_5.ds__month + , subq_5.ds__quarter + , subq_5.ds__year + , subq_5.ds__extract_year + , subq_5.ds__extract_quarter + , subq_5.ds__extract_month + , subq_5.ds__extract_day + , subq_5.ds__extract_dow + , subq_5.ds__extract_doy + , subq_5.created_at__day + , subq_5.created_at__week + , subq_5.created_at__month + , subq_5.created_at__quarter + , subq_5.created_at__year + , subq_5.created_at__extract_year + , subq_5.created_at__extract_quarter + , subq_5.created_at__extract_month + , subq_5.created_at__extract_day + , subq_5.created_at__extract_dow + , subq_5.created_at__extract_doy + , subq_5.ds_partitioned__day + , subq_5.ds_partitioned__week + , subq_5.ds_partitioned__month + , subq_5.ds_partitioned__quarter + , subq_5.ds_partitioned__year + , subq_5.ds_partitioned__extract_year + , subq_5.ds_partitioned__extract_quarter + , subq_5.ds_partitioned__extract_month + , subq_5.ds_partitioned__extract_day + , subq_5.ds_partitioned__extract_dow + , subq_5.ds_partitioned__extract_doy + , subq_5.last_profile_edit_ts__millisecond + , subq_5.last_profile_edit_ts__second + , subq_5.last_profile_edit_ts__minute + , subq_5.last_profile_edit_ts__hour + , subq_5.last_profile_edit_ts__day + , subq_5.last_profile_edit_ts__week + , subq_5.last_profile_edit_ts__month + , subq_5.last_profile_edit_ts__quarter + , subq_5.last_profile_edit_ts__year + , subq_5.last_profile_edit_ts__extract_year + , subq_5.last_profile_edit_ts__extract_quarter + , subq_5.last_profile_edit_ts__extract_month + , subq_5.last_profile_edit_ts__extract_day + , subq_5.last_profile_edit_ts__extract_dow + , subq_5.last_profile_edit_ts__extract_doy + , subq_5.bio_added_ts__second + , subq_5.bio_added_ts__minute + , subq_5.bio_added_ts__hour + , subq_5.bio_added_ts__day + , subq_5.bio_added_ts__week + , subq_5.bio_added_ts__month + , subq_5.bio_added_ts__quarter + , subq_5.bio_added_ts__year + , subq_5.bio_added_ts__extract_year + , subq_5.bio_added_ts__extract_quarter + , subq_5.bio_added_ts__extract_month + , subq_5.bio_added_ts__extract_day + , subq_5.bio_added_ts__extract_dow + , subq_5.bio_added_ts__extract_doy + , subq_5.last_login_ts__minute + , subq_5.last_login_ts__hour + , subq_5.last_login_ts__day + , subq_5.last_login_ts__week + , subq_5.last_login_ts__month + , subq_5.last_login_ts__quarter + , subq_5.last_login_ts__year + , subq_5.last_login_ts__extract_year + , subq_5.last_login_ts__extract_quarter + , subq_5.last_login_ts__extract_month + , subq_5.last_login_ts__extract_day + , subq_5.last_login_ts__extract_dow + , subq_5.last_login_ts__extract_doy + , subq_5.archived_at__hour + , subq_5.archived_at__day + , subq_5.archived_at__week + , subq_5.archived_at__month + , subq_5.archived_at__quarter + , subq_5.archived_at__year + , subq_5.archived_at__extract_year + , subq_5.archived_at__extract_quarter + , subq_5.archived_at__extract_month + , subq_5.archived_at__extract_day + , subq_5.archived_at__extract_dow + , subq_5.archived_at__extract_doy + , subq_5.user__ds__day + , subq_5.user__ds__week + , subq_5.user__ds__month + , subq_5.user__ds__quarter + , subq_5.user__ds__year + , subq_5.user__ds__extract_year + , subq_5.user__ds__extract_quarter + , subq_5.user__ds__extract_month + , subq_5.user__ds__extract_day + , subq_5.user__ds__extract_dow + , subq_5.user__ds__extract_doy + , subq_5.user__created_at__day + , subq_5.user__created_at__week + , subq_5.user__created_at__month + , subq_5.user__created_at__quarter + , subq_5.user__created_at__year + , subq_5.user__created_at__extract_year + , subq_5.user__created_at__extract_quarter + , subq_5.user__created_at__extract_month + , subq_5.user__created_at__extract_day + , subq_5.user__created_at__extract_dow + , subq_5.user__created_at__extract_doy + , subq_5.user__ds_partitioned__day + , subq_5.user__ds_partitioned__week + , subq_5.user__ds_partitioned__month + , subq_5.user__ds_partitioned__quarter + , subq_5.user__ds_partitioned__year + , subq_5.user__ds_partitioned__extract_year + , subq_5.user__ds_partitioned__extract_quarter + , subq_5.user__ds_partitioned__extract_month + , subq_5.user__ds_partitioned__extract_day + , subq_5.user__ds_partitioned__extract_dow + , subq_5.user__ds_partitioned__extract_doy + , subq_5.user__last_profile_edit_ts__millisecond + , subq_5.user__last_profile_edit_ts__second + , subq_5.user__last_profile_edit_ts__minute + , subq_5.user__last_profile_edit_ts__hour + , subq_5.user__last_profile_edit_ts__day + , subq_5.user__last_profile_edit_ts__week + , subq_5.user__last_profile_edit_ts__month + , subq_5.user__last_profile_edit_ts__quarter + , subq_5.user__last_profile_edit_ts__year + , subq_5.user__last_profile_edit_ts__extract_year + , subq_5.user__last_profile_edit_ts__extract_quarter + , subq_5.user__last_profile_edit_ts__extract_month + , subq_5.user__last_profile_edit_ts__extract_day + , subq_5.user__last_profile_edit_ts__extract_dow + , subq_5.user__last_profile_edit_ts__extract_doy + , subq_5.user__bio_added_ts__second + , subq_5.user__bio_added_ts__minute + , subq_5.user__bio_added_ts__hour + , subq_5.user__bio_added_ts__day + , subq_5.user__bio_added_ts__week + , subq_5.user__bio_added_ts__month + , subq_5.user__bio_added_ts__quarter + , subq_5.user__bio_added_ts__year + , subq_5.user__bio_added_ts__extract_year + , subq_5.user__bio_added_ts__extract_quarter + , subq_5.user__bio_added_ts__extract_month + , subq_5.user__bio_added_ts__extract_day + , subq_5.user__bio_added_ts__extract_dow + , subq_5.user__bio_added_ts__extract_doy + , subq_5.user__last_login_ts__minute + , subq_5.user__last_login_ts__hour + , subq_5.user__last_login_ts__day + , subq_5.user__last_login_ts__week + , subq_5.user__last_login_ts__month + , subq_5.user__last_login_ts__quarter + , subq_5.user__last_login_ts__year + , subq_5.user__last_login_ts__extract_year + , subq_5.user__last_login_ts__extract_quarter + , subq_5.user__last_login_ts__extract_month + , subq_5.user__last_login_ts__extract_day + , subq_5.user__last_login_ts__extract_dow + , subq_5.user__last_login_ts__extract_doy + , subq_5.user__archived_at__hour + , subq_5.user__archived_at__day + , subq_5.user__archived_at__week + , subq_5.user__archived_at__month + , subq_5.user__archived_at__quarter + , subq_5.user__archived_at__year + , subq_5.user__archived_at__extract_year + , subq_5.user__archived_at__extract_quarter + , subq_5.user__archived_at__extract_month + , subq_5.user__archived_at__extract_day + , subq_5.user__archived_at__extract_dow + , subq_5.user__archived_at__extract_doy + , subq_5.archived_at__hour AS metric_time__hour + , subq_5.archived_at__day AS metric_time__day + , subq_5.archived_at__week AS metric_time__week + , subq_5.archived_at__month AS metric_time__month + , subq_5.archived_at__quarter AS metric_time__quarter + , subq_5.archived_at__year AS metric_time__year + , subq_5.archived_at__extract_year AS metric_time__extract_year + , subq_5.archived_at__extract_quarter AS metric_time__extract_quarter + , subq_5.archived_at__extract_month AS metric_time__extract_month + , subq_5.archived_at__extract_day AS metric_time__extract_day + , subq_5.archived_at__extract_dow AS metric_time__extract_dow + , subq_5.archived_at__extract_doy AS metric_time__extract_doy + , subq_5.user + , subq_5.home_state + , subq_5.user__home_state + , subq_5.archived_users + FROM ( + -- Read Elements From Semantic Model 'users_ds_source' + SELECT + 1 AS new_users + , 1 AS archived_users + , DATETIME_TRUNC(users_ds_source_src_28000.ds, day) AS ds__day + , DATETIME_TRUNC(users_ds_source_src_28000.ds, isoweek) AS ds__week + , DATETIME_TRUNC(users_ds_source_src_28000.ds, month) AS ds__month + , DATETIME_TRUNC(users_ds_source_src_28000.ds, quarter) AS ds__quarter + , DATETIME_TRUNC(users_ds_source_src_28000.ds, year) AS ds__year + , EXTRACT(year FROM users_ds_source_src_28000.ds) AS ds__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.ds) AS ds__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.ds) AS ds__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.ds) AS ds__extract_day + , IF(EXTRACT(dayofweek FROM users_ds_source_src_28000.ds) = 1, 7, EXTRACT(dayofweek FROM users_ds_source_src_28000.ds) - 1) AS ds__extract_dow + , EXTRACT(dayofyear FROM users_ds_source_src_28000.ds) AS ds__extract_doy + , DATETIME_TRUNC(users_ds_source_src_28000.created_at, day) AS created_at__day + , DATETIME_TRUNC(users_ds_source_src_28000.created_at, isoweek) AS created_at__week + , DATETIME_TRUNC(users_ds_source_src_28000.created_at, month) AS created_at__month + , DATETIME_TRUNC(users_ds_source_src_28000.created_at, quarter) AS created_at__quarter + , DATETIME_TRUNC(users_ds_source_src_28000.created_at, year) AS created_at__year + , EXTRACT(year FROM users_ds_source_src_28000.created_at) AS created_at__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.created_at) AS created_at__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.created_at) AS created_at__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.created_at) AS created_at__extract_day + , IF(EXTRACT(dayofweek FROM users_ds_source_src_28000.created_at) = 1, 7, EXTRACT(dayofweek FROM users_ds_source_src_28000.created_at) - 1) AS created_at__extract_dow + , EXTRACT(dayofyear FROM users_ds_source_src_28000.created_at) AS created_at__extract_doy + , DATETIME_TRUNC(users_ds_source_src_28000.ds_partitioned, day) AS ds_partitioned__day + , DATETIME_TRUNC(users_ds_source_src_28000.ds_partitioned, isoweek) AS ds_partitioned__week + , DATETIME_TRUNC(users_ds_source_src_28000.ds_partitioned, month) AS ds_partitioned__month + , DATETIME_TRUNC(users_ds_source_src_28000.ds_partitioned, quarter) AS ds_partitioned__quarter + , DATETIME_TRUNC(users_ds_source_src_28000.ds_partitioned, year) AS ds_partitioned__year + , EXTRACT(year FROM users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__extract_day + , IF(EXTRACT(dayofweek FROM users_ds_source_src_28000.ds_partitioned) = 1, 7, EXTRACT(dayofweek FROM users_ds_source_src_28000.ds_partitioned) - 1) AS ds_partitioned__extract_dow + , EXTRACT(dayofyear FROM users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__extract_doy + , users_ds_source_src_28000.home_state + , DATETIME_TRUNC(users_ds_source_src_28000.last_profile_edit_ts, millisecond) AS last_profile_edit_ts__millisecond + , DATETIME_TRUNC(users_ds_source_src_28000.last_profile_edit_ts, second) AS last_profile_edit_ts__second + , DATETIME_TRUNC(users_ds_source_src_28000.last_profile_edit_ts, minute) AS last_profile_edit_ts__minute + , DATETIME_TRUNC(users_ds_source_src_28000.last_profile_edit_ts, hour) AS last_profile_edit_ts__hour + , DATETIME_TRUNC(users_ds_source_src_28000.last_profile_edit_ts, day) AS last_profile_edit_ts__day + , DATETIME_TRUNC(users_ds_source_src_28000.last_profile_edit_ts, isoweek) AS last_profile_edit_ts__week + , DATETIME_TRUNC(users_ds_source_src_28000.last_profile_edit_ts, month) AS last_profile_edit_ts__month + , DATETIME_TRUNC(users_ds_source_src_28000.last_profile_edit_ts, quarter) AS last_profile_edit_ts__quarter + , DATETIME_TRUNC(users_ds_source_src_28000.last_profile_edit_ts, year) AS last_profile_edit_ts__year + , EXTRACT(year FROM users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__extract_day + , IF(EXTRACT(dayofweek FROM users_ds_source_src_28000.last_profile_edit_ts) = 1, 7, EXTRACT(dayofweek FROM users_ds_source_src_28000.last_profile_edit_ts) - 1) AS last_profile_edit_ts__extract_dow + , EXTRACT(dayofyear FROM users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__extract_doy + , DATETIME_TRUNC(users_ds_source_src_28000.bio_added_ts, second) AS bio_added_ts__second + , DATETIME_TRUNC(users_ds_source_src_28000.bio_added_ts, minute) AS bio_added_ts__minute + , DATETIME_TRUNC(users_ds_source_src_28000.bio_added_ts, hour) AS bio_added_ts__hour + , DATETIME_TRUNC(users_ds_source_src_28000.bio_added_ts, day) AS bio_added_ts__day + , DATETIME_TRUNC(users_ds_source_src_28000.bio_added_ts, isoweek) AS bio_added_ts__week + , DATETIME_TRUNC(users_ds_source_src_28000.bio_added_ts, month) AS bio_added_ts__month + , DATETIME_TRUNC(users_ds_source_src_28000.bio_added_ts, quarter) AS bio_added_ts__quarter + , DATETIME_TRUNC(users_ds_source_src_28000.bio_added_ts, year) AS bio_added_ts__year + , EXTRACT(year FROM users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__extract_day + , IF(EXTRACT(dayofweek FROM users_ds_source_src_28000.bio_added_ts) = 1, 7, EXTRACT(dayofweek FROM users_ds_source_src_28000.bio_added_ts) - 1) AS bio_added_ts__extract_dow + , EXTRACT(dayofyear FROM users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__extract_doy + , DATETIME_TRUNC(users_ds_source_src_28000.last_login_ts, minute) AS last_login_ts__minute + , DATETIME_TRUNC(users_ds_source_src_28000.last_login_ts, hour) AS last_login_ts__hour + , DATETIME_TRUNC(users_ds_source_src_28000.last_login_ts, day) AS last_login_ts__day + , DATETIME_TRUNC(users_ds_source_src_28000.last_login_ts, isoweek) AS last_login_ts__week + , DATETIME_TRUNC(users_ds_source_src_28000.last_login_ts, month) AS last_login_ts__month + , DATETIME_TRUNC(users_ds_source_src_28000.last_login_ts, quarter) AS last_login_ts__quarter + , DATETIME_TRUNC(users_ds_source_src_28000.last_login_ts, year) AS last_login_ts__year + , EXTRACT(year FROM users_ds_source_src_28000.last_login_ts) AS last_login_ts__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.last_login_ts) AS last_login_ts__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.last_login_ts) AS last_login_ts__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.last_login_ts) AS last_login_ts__extract_day + , IF(EXTRACT(dayofweek FROM users_ds_source_src_28000.last_login_ts) = 1, 7, EXTRACT(dayofweek FROM users_ds_source_src_28000.last_login_ts) - 1) AS last_login_ts__extract_dow + , EXTRACT(dayofyear FROM users_ds_source_src_28000.last_login_ts) AS last_login_ts__extract_doy + , DATETIME_TRUNC(users_ds_source_src_28000.archived_at, hour) AS archived_at__hour + , DATETIME_TRUNC(users_ds_source_src_28000.archived_at, day) AS archived_at__day + , DATETIME_TRUNC(users_ds_source_src_28000.archived_at, isoweek) AS archived_at__week + , DATETIME_TRUNC(users_ds_source_src_28000.archived_at, month) AS archived_at__month + , DATETIME_TRUNC(users_ds_source_src_28000.archived_at, quarter) AS archived_at__quarter + , DATETIME_TRUNC(users_ds_source_src_28000.archived_at, year) AS archived_at__year + , EXTRACT(year FROM users_ds_source_src_28000.archived_at) AS archived_at__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.archived_at) AS archived_at__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.archived_at) AS archived_at__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.archived_at) AS archived_at__extract_day + , IF(EXTRACT(dayofweek FROM users_ds_source_src_28000.archived_at) = 1, 7, EXTRACT(dayofweek FROM users_ds_source_src_28000.archived_at) - 1) AS archived_at__extract_dow + , EXTRACT(dayofyear FROM users_ds_source_src_28000.archived_at) AS archived_at__extract_doy + , DATETIME_TRUNC(users_ds_source_src_28000.ds, day) AS user__ds__day + , DATETIME_TRUNC(users_ds_source_src_28000.ds, isoweek) AS user__ds__week + , DATETIME_TRUNC(users_ds_source_src_28000.ds, month) AS user__ds__month + , DATETIME_TRUNC(users_ds_source_src_28000.ds, quarter) AS user__ds__quarter + , DATETIME_TRUNC(users_ds_source_src_28000.ds, year) AS user__ds__year + , EXTRACT(year FROM users_ds_source_src_28000.ds) AS user__ds__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.ds) AS user__ds__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.ds) AS user__ds__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.ds) AS user__ds__extract_day + , IF(EXTRACT(dayofweek FROM users_ds_source_src_28000.ds) = 1, 7, EXTRACT(dayofweek FROM users_ds_source_src_28000.ds) - 1) AS user__ds__extract_dow + , EXTRACT(dayofyear FROM users_ds_source_src_28000.ds) AS user__ds__extract_doy + , DATETIME_TRUNC(users_ds_source_src_28000.created_at, day) AS user__created_at__day + , DATETIME_TRUNC(users_ds_source_src_28000.created_at, isoweek) AS user__created_at__week + , DATETIME_TRUNC(users_ds_source_src_28000.created_at, month) AS user__created_at__month + , DATETIME_TRUNC(users_ds_source_src_28000.created_at, quarter) AS user__created_at__quarter + , DATETIME_TRUNC(users_ds_source_src_28000.created_at, year) AS user__created_at__year + , EXTRACT(year FROM users_ds_source_src_28000.created_at) AS user__created_at__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.created_at) AS user__created_at__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.created_at) AS user__created_at__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.created_at) AS user__created_at__extract_day + , IF(EXTRACT(dayofweek FROM users_ds_source_src_28000.created_at) = 1, 7, EXTRACT(dayofweek FROM users_ds_source_src_28000.created_at) - 1) AS user__created_at__extract_dow + , EXTRACT(dayofyear FROM users_ds_source_src_28000.created_at) AS user__created_at__extract_doy + , DATETIME_TRUNC(users_ds_source_src_28000.ds_partitioned, day) AS user__ds_partitioned__day + , DATETIME_TRUNC(users_ds_source_src_28000.ds_partitioned, isoweek) AS user__ds_partitioned__week + , DATETIME_TRUNC(users_ds_source_src_28000.ds_partitioned, month) AS user__ds_partitioned__month + , DATETIME_TRUNC(users_ds_source_src_28000.ds_partitioned, quarter) AS user__ds_partitioned__quarter + , DATETIME_TRUNC(users_ds_source_src_28000.ds_partitioned, year) AS user__ds_partitioned__year + , EXTRACT(year FROM users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__extract_day + , IF(EXTRACT(dayofweek FROM users_ds_source_src_28000.ds_partitioned) = 1, 7, EXTRACT(dayofweek FROM users_ds_source_src_28000.ds_partitioned) - 1) AS user__ds_partitioned__extract_dow + , EXTRACT(dayofyear FROM users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__extract_doy + , users_ds_source_src_28000.home_state AS user__home_state + , DATETIME_TRUNC(users_ds_source_src_28000.last_profile_edit_ts, millisecond) AS user__last_profile_edit_ts__millisecond + , DATETIME_TRUNC(users_ds_source_src_28000.last_profile_edit_ts, second) AS user__last_profile_edit_ts__second + , DATETIME_TRUNC(users_ds_source_src_28000.last_profile_edit_ts, minute) AS user__last_profile_edit_ts__minute + , DATETIME_TRUNC(users_ds_source_src_28000.last_profile_edit_ts, hour) AS user__last_profile_edit_ts__hour + , DATETIME_TRUNC(users_ds_source_src_28000.last_profile_edit_ts, day) AS user__last_profile_edit_ts__day + , DATETIME_TRUNC(users_ds_source_src_28000.last_profile_edit_ts, isoweek) AS user__last_profile_edit_ts__week + , DATETIME_TRUNC(users_ds_source_src_28000.last_profile_edit_ts, month) AS user__last_profile_edit_ts__month + , DATETIME_TRUNC(users_ds_source_src_28000.last_profile_edit_ts, quarter) AS user__last_profile_edit_ts__quarter + , DATETIME_TRUNC(users_ds_source_src_28000.last_profile_edit_ts, year) AS user__last_profile_edit_ts__year + , EXTRACT(year FROM users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__extract_day + , IF(EXTRACT(dayofweek FROM users_ds_source_src_28000.last_profile_edit_ts) = 1, 7, EXTRACT(dayofweek FROM users_ds_source_src_28000.last_profile_edit_ts) - 1) AS user__last_profile_edit_ts__extract_dow + , EXTRACT(dayofyear FROM users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__extract_doy + , DATETIME_TRUNC(users_ds_source_src_28000.bio_added_ts, second) AS user__bio_added_ts__second + , DATETIME_TRUNC(users_ds_source_src_28000.bio_added_ts, minute) AS user__bio_added_ts__minute + , DATETIME_TRUNC(users_ds_source_src_28000.bio_added_ts, hour) AS user__bio_added_ts__hour + , DATETIME_TRUNC(users_ds_source_src_28000.bio_added_ts, day) AS user__bio_added_ts__day + , DATETIME_TRUNC(users_ds_source_src_28000.bio_added_ts, isoweek) AS user__bio_added_ts__week + , DATETIME_TRUNC(users_ds_source_src_28000.bio_added_ts, month) AS user__bio_added_ts__month + , DATETIME_TRUNC(users_ds_source_src_28000.bio_added_ts, quarter) AS user__bio_added_ts__quarter + , DATETIME_TRUNC(users_ds_source_src_28000.bio_added_ts, year) AS user__bio_added_ts__year + , EXTRACT(year FROM users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__extract_day + , IF(EXTRACT(dayofweek FROM users_ds_source_src_28000.bio_added_ts) = 1, 7, EXTRACT(dayofweek FROM users_ds_source_src_28000.bio_added_ts) - 1) AS user__bio_added_ts__extract_dow + , EXTRACT(dayofyear FROM users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__extract_doy + , DATETIME_TRUNC(users_ds_source_src_28000.last_login_ts, minute) AS user__last_login_ts__minute + , DATETIME_TRUNC(users_ds_source_src_28000.last_login_ts, hour) AS user__last_login_ts__hour + , DATETIME_TRUNC(users_ds_source_src_28000.last_login_ts, day) AS user__last_login_ts__day + , DATETIME_TRUNC(users_ds_source_src_28000.last_login_ts, isoweek) AS user__last_login_ts__week + , DATETIME_TRUNC(users_ds_source_src_28000.last_login_ts, month) AS user__last_login_ts__month + , DATETIME_TRUNC(users_ds_source_src_28000.last_login_ts, quarter) AS user__last_login_ts__quarter + , DATETIME_TRUNC(users_ds_source_src_28000.last_login_ts, year) AS user__last_login_ts__year + , EXTRACT(year FROM users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__extract_day + , IF(EXTRACT(dayofweek FROM users_ds_source_src_28000.last_login_ts) = 1, 7, EXTRACT(dayofweek FROM users_ds_source_src_28000.last_login_ts) - 1) AS user__last_login_ts__extract_dow + , EXTRACT(dayofyear FROM users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__extract_doy + , DATETIME_TRUNC(users_ds_source_src_28000.archived_at, hour) AS user__archived_at__hour + , DATETIME_TRUNC(users_ds_source_src_28000.archived_at, day) AS user__archived_at__day + , DATETIME_TRUNC(users_ds_source_src_28000.archived_at, isoweek) AS user__archived_at__week + , DATETIME_TRUNC(users_ds_source_src_28000.archived_at, month) AS user__archived_at__month + , DATETIME_TRUNC(users_ds_source_src_28000.archived_at, quarter) AS user__archived_at__quarter + , DATETIME_TRUNC(users_ds_source_src_28000.archived_at, year) AS user__archived_at__year + , EXTRACT(year FROM users_ds_source_src_28000.archived_at) AS user__archived_at__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.archived_at) AS user__archived_at__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.archived_at) AS user__archived_at__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.archived_at) AS user__archived_at__extract_day + , IF(EXTRACT(dayofweek FROM users_ds_source_src_28000.archived_at) = 1, 7, EXTRACT(dayofweek FROM users_ds_source_src_28000.archived_at) - 1) AS user__archived_at__extract_dow + , EXTRACT(dayofyear FROM users_ds_source_src_28000.archived_at) AS user__archived_at__extract_doy + , users_ds_source_src_28000.user_id AS user + FROM ***************************.dim_users users_ds_source_src_28000 + ) subq_5 + ) subq_6 + ON + subq_13.ts__hour = subq_6.metric_time__hour + ) subq_14 + ) subq_15 + GROUP BY + metric_time__hour + ) subq_16 +) subq_17 diff --git a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/BigQuery/test_custom_offset_window_with_multiple_time_spines__plan0_optimized.sql b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/BigQuery/test_custom_offset_window_with_multiple_time_spines__plan0_optimized.sql new file mode 100644 index 0000000000..cfba00928d --- /dev/null +++ b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/BigQuery/test_custom_offset_window_with_multiple_time_spines__plan0_optimized.sql @@ -0,0 +1,87 @@ +test_name: test_custom_offset_window_with_multiple_time_spines +test_filename: test_custom_granularity.py +sql_engine: BigQuery +--- +-- Compute Metrics via Expressions +SELECT + metric_time__hour + , archived_users AS archived_users_offset_1_martian_day +FROM ( + -- Join to Time Spine Dataset + -- Pass Only Elements: ['archived_users', 'metric_time__hour'] + -- Aggregate Measures + -- Compute Metrics via Expressions + SELECT + subq_29.ts__hour__lead AS metric_time__hour + , SUM(subq_24.archived_users) AS archived_users + FROM ( + -- Offset Base Granularity By Custom Granularity Period(s) + WITH cte_6 AS ( + -- Get Custom Granularity Bounds + SELECT + time_spine_src_28005.ts AS ts__hour + , time_spine_src_28006.martian_day AS ds__martian_day + , FIRST_VALUE(time_spine_src_28005.ts) OVER ( + PARTITION BY time_spine_src_28006.martian_day + ORDER BY time_spine_src_28005.ts + ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING + ) AS ts__hour__first_value + , LAST_VALUE(time_spine_src_28005.ts) OVER ( + PARTITION BY time_spine_src_28006.martian_day + ORDER BY time_spine_src_28005.ts + ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING + ) AS ts__hour__last_value + , ROW_NUMBER() OVER ( + PARTITION BY time_spine_src_28006.martian_day + ORDER BY time_spine_src_28005.ts + ) AS ts__hour__row_number + FROM ***************************.mf_time_spine time_spine_src_28006 + INNER JOIN + ***************************.mf_time_spine_hour time_spine_src_28005 + ON + time_spine_src_28006.ds = DATETIME_TRUNC(time_spine_src_28005.ts, day) + ) + + SELECT + cte_6.ts__hour AS ts__hour + , CASE + WHEN DATE_ADD(CAST(subq_28.ts__hour__first_value__lead AS DATETIME), INTERVAL cte_6.ts__hour__row_number - 1 hour) <= subq_28.ts__hour__last_value__lead + THEN DATE_ADD(CAST(subq_28.ts__hour__first_value__lead AS DATETIME), INTERVAL cte_6.ts__hour__row_number - 1 hour) + ELSE NULL + END AS ts__hour__lead + FROM cte_6 cte_6 + INNER JOIN ( + -- Offset Custom Granularity Bounds + SELECT + ds__martian_day + , LEAD(ts__hour__first_value, 1) OVER (ORDER BY ds__martian_day) AS ts__hour__first_value__lead + , LEAD(ts__hour__last_value, 1) OVER (ORDER BY ds__martian_day) AS ts__hour__last_value__lead + FROM ( + -- Get Unique Rows for Custom Granularity Bounds + SELECT + ds__martian_day + , ts__hour__first_value + , ts__hour__last_value + FROM cte_6 cte_6 + GROUP BY + ds__martian_day + , ts__hour__first_value + , ts__hour__last_value + ) subq_27 + ) subq_28 + ON + cte_6.ds__martian_day = subq_28.ds__martian_day + ) subq_29 + INNER JOIN ( + -- Read Elements From Semantic Model 'users_ds_source' + -- Metric Time Dimension 'archived_at' + SELECT + DATETIME_TRUNC(archived_at, hour) AS metric_time__hour + , 1 AS archived_users + FROM ***************************.dim_users users_ds_source_src_28000 + ) subq_24 + ON + subq_29.ts__hour = subq_24.metric_time__hour + GROUP BY + metric_time__hour +) subq_35 diff --git a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Databricks/test_custom_offset_window__plan0.sql b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Databricks/test_custom_offset_window__plan0.sql index 1b4941cb5b..75d7fa61bf 100644 --- a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Databricks/test_custom_offset_window__plan0.sql +++ b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Databricks/test_custom_offset_window__plan0.sql @@ -137,28 +137,18 @@ FROM ( WITH cte_2 AS ( -- Get Custom Granularity Bounds SELECT - time_spine_src_28006.ds AS ds__day - , DATE_TRUNC('week', time_spine_src_28006.ds) AS ds__week - , DATE_TRUNC('month', time_spine_src_28006.ds) AS ds__month - , DATE_TRUNC('quarter', time_spine_src_28006.ds) AS ds__quarter - , DATE_TRUNC('year', time_spine_src_28006.ds) AS ds__year - , EXTRACT(year FROM time_spine_src_28006.ds) AS ds__extract_year - , EXTRACT(quarter FROM time_spine_src_28006.ds) AS ds__extract_quarter - , EXTRACT(month FROM time_spine_src_28006.ds) AS ds__extract_month - , EXTRACT(day FROM time_spine_src_28006.ds) AS ds__extract_day - , EXTRACT(DAYOFWEEK_ISO FROM time_spine_src_28006.ds) AS ds__extract_dow - , EXTRACT(doy FROM time_spine_src_28006.ds) AS ds__extract_doy - , time_spine_src_28006.martian_day AS ds__martian_day + subq_6.ds__day + , subq_6.ds__martian_day , FIRST_VALUE(subq_6.ds__day) OVER ( PARTITION BY subq_6.ds__martian_day ORDER BY subq_6.ds__day ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) AS ds__martian_day__first_value + ) AS ds__day__first_value , LAST_VALUE(subq_6.ds__day) OVER ( PARTITION BY subq_6.ds__martian_day ORDER BY subq_6.ds__day ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) AS ds__martian_day__last_value + ) AS ds__day__last_value , ROW_NUMBER() OVER ( PARTITION BY subq_6.ds__martian_day ORDER BY subq_6.ds__day @@ -185,8 +175,8 @@ FROM ( SELECT cte_2.ds__day AS ds__day , CASE - WHEN DATEADD(day, (cte_2.ds__day__row_number - 1), subq_8.ds__martian_day__first_value__lead) <= subq_8.ds__martian_day__last_value__lead - THEN DATEADD(day, (cte_2.ds__day__row_number - 1), subq_8.ds__martian_day__first_value__lead) + WHEN DATEADD(day, (cte_2.ds__day__row_number - 1), subq_8.ds__day__first_value__lead) <= subq_8.ds__day__last_value__lead + THEN DATEADD(day, (cte_2.ds__day__row_number - 1), subq_8.ds__day__first_value__lead) ELSE NULL END AS ds__day__lead FROM cte_2 cte_2 @@ -194,19 +184,19 @@ FROM ( -- Offset Custom Granularity Bounds SELECT subq_7.ds__martian_day - , LEAD(subq_7.ds__martian_day__first_value, 1) OVER (ORDER BY subq_7.ds__martian_day) AS ds__martian_day__first_value__lead - , LEAD(subq_7.ds__martian_day__last_value, 1) OVER (ORDER BY subq_7.ds__martian_day) AS ds__martian_day__last_value__lead + , LEAD(subq_7.ds__day__first_value, 1) OVER (ORDER BY subq_7.ds__martian_day) AS ds__day__first_value__lead + , LEAD(subq_7.ds__day__last_value, 1) OVER (ORDER BY subq_7.ds__martian_day) AS ds__day__last_value__lead FROM ( -- Get Unique Rows for Custom Granularity Bounds SELECT cte_2.ds__martian_day - , cte_2.ds__martian_day__first_value - , cte_2.ds__martian_day__last_value + , cte_2.ds__day__first_value + , cte_2.ds__day__last_value FROM cte_2 cte_2 GROUP BY cte_2.ds__martian_day - , cte_2.ds__martian_day__first_value - , cte_2.ds__martian_day__last_value + , cte_2.ds__day__first_value + , cte_2.ds__day__last_value ) subq_7 ) subq_8 ON diff --git a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Databricks/test_custom_offset_window__plan0_optimized.sql b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Databricks/test_custom_offset_window__plan0_optimized.sql index e0b92b9896..1fd88ad018 100644 --- a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Databricks/test_custom_offset_window__plan0_optimized.sql +++ b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Databricks/test_custom_offset_window__plan0_optimized.sql @@ -26,12 +26,12 @@ FROM ( PARTITION BY martian_day ORDER BY ds ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) AS ds__martian_day__first_value + ) AS ds__day__first_value , LAST_VALUE(ds) OVER ( PARTITION BY martian_day ORDER BY ds ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) AS ds__martian_day__last_value + ) AS ds__day__last_value , ROW_NUMBER() OVER ( PARTITION BY martian_day ORDER BY ds @@ -42,8 +42,8 @@ FROM ( SELECT cte_6.ds__day AS ds__day , CASE - WHEN DATEADD(day, (cte_6.ds__day__row_number - 1), subq_24.ds__martian_day__first_value__lead) <= subq_24.ds__martian_day__last_value__lead - THEN DATEADD(day, (cte_6.ds__day__row_number - 1), subq_24.ds__martian_day__first_value__lead) + WHEN DATEADD(day, (cte_6.ds__day__row_number - 1), subq_24.ds__day__first_value__lead) <= subq_24.ds__day__last_value__lead + THEN DATEADD(day, (cte_6.ds__day__row_number - 1), subq_24.ds__day__first_value__lead) ELSE NULL END AS ds__day__lead FROM cte_6 cte_6 @@ -51,19 +51,19 @@ FROM ( -- Offset Custom Granularity Bounds SELECT ds__martian_day - , LEAD(ds__martian_day__first_value, 1) OVER (ORDER BY ds__martian_day) AS ds__martian_day__first_value__lead - , LEAD(ds__martian_day__last_value, 1) OVER (ORDER BY ds__martian_day) AS ds__martian_day__last_value__lead + , LEAD(ds__day__first_value, 1) OVER (ORDER BY ds__martian_day) AS ds__day__first_value__lead + , LEAD(ds__day__last_value, 1) OVER (ORDER BY ds__martian_day) AS ds__day__last_value__lead FROM ( -- Get Unique Rows for Custom Granularity Bounds SELECT ds__martian_day - , ds__martian_day__first_value - , ds__martian_day__last_value + , ds__day__first_value + , ds__day__last_value FROM cte_6 cte_6 GROUP BY ds__martian_day - , ds__martian_day__first_value - , ds__martian_day__last_value + , ds__day__first_value + , ds__day__last_value ) subq_23 ) subq_24 ON diff --git a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Databricks/test_custom_offset_window_with_granularity_and_date_part__plan0.sql b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Databricks/test_custom_offset_window_with_granularity_and_date_part__plan0.sql index 541a044372..9024b5864d 100644 --- a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Databricks/test_custom_offset_window_with_granularity_and_date_part__plan0.sql +++ b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Databricks/test_custom_offset_window_with_granularity_and_date_part__plan0.sql @@ -151,28 +151,18 @@ FROM ( WITH cte_2 AS ( -- Get Custom Granularity Bounds SELECT - time_spine_src_28006.ds AS ds__day - , DATE_TRUNC('week', time_spine_src_28006.ds) AS ds__week - , DATE_TRUNC('month', time_spine_src_28006.ds) AS ds__month - , DATE_TRUNC('quarter', time_spine_src_28006.ds) AS ds__quarter - , DATE_TRUNC('year', time_spine_src_28006.ds) AS ds__year - , EXTRACT(year FROM time_spine_src_28006.ds) AS ds__extract_year - , EXTRACT(quarter FROM time_spine_src_28006.ds) AS ds__extract_quarter - , EXTRACT(month FROM time_spine_src_28006.ds) AS ds__extract_month - , EXTRACT(day FROM time_spine_src_28006.ds) AS ds__extract_day - , EXTRACT(DAYOFWEEK_ISO FROM time_spine_src_28006.ds) AS ds__extract_dow - , EXTRACT(doy FROM time_spine_src_28006.ds) AS ds__extract_doy - , time_spine_src_28006.martian_day AS ds__martian_day + subq_6.ds__day + , subq_6.ds__martian_day , FIRST_VALUE(subq_6.ds__day) OVER ( PARTITION BY subq_6.ds__martian_day ORDER BY subq_6.ds__day ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) AS ds__martian_day__first_value + ) AS ds__day__first_value , LAST_VALUE(subq_6.ds__day) OVER ( PARTITION BY subq_6.ds__martian_day ORDER BY subq_6.ds__day ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) AS ds__martian_day__last_value + ) AS ds__day__last_value , ROW_NUMBER() OVER ( PARTITION BY subq_6.ds__martian_day ORDER BY subq_6.ds__day @@ -199,8 +189,8 @@ FROM ( SELECT cte_2.ds__day AS ds__day , CASE - WHEN DATEADD(day, (cte_2.ds__day__row_number - 1), subq_8.ds__martian_day__first_value__lead) <= subq_8.ds__martian_day__last_value__lead - THEN DATEADD(day, (cte_2.ds__day__row_number - 1), subq_8.ds__martian_day__first_value__lead) + WHEN DATEADD(day, (cte_2.ds__day__row_number - 1), subq_8.ds__day__first_value__lead) <= subq_8.ds__day__last_value__lead + THEN DATEADD(day, (cte_2.ds__day__row_number - 1), subq_8.ds__day__first_value__lead) ELSE NULL END AS ds__day__lead FROM cte_2 cte_2 @@ -208,19 +198,19 @@ FROM ( -- Offset Custom Granularity Bounds SELECT subq_7.ds__martian_day - , LEAD(subq_7.ds__martian_day__first_value, 1) OVER (ORDER BY subq_7.ds__martian_day) AS ds__martian_day__first_value__lead - , LEAD(subq_7.ds__martian_day__last_value, 1) OVER (ORDER BY subq_7.ds__martian_day) AS ds__martian_day__last_value__lead + , LEAD(subq_7.ds__day__first_value, 1) OVER (ORDER BY subq_7.ds__martian_day) AS ds__day__first_value__lead + , LEAD(subq_7.ds__day__last_value, 1) OVER (ORDER BY subq_7.ds__martian_day) AS ds__day__last_value__lead FROM ( -- Get Unique Rows for Custom Granularity Bounds SELECT cte_2.ds__martian_day - , cte_2.ds__martian_day__first_value - , cte_2.ds__martian_day__last_value + , cte_2.ds__day__first_value + , cte_2.ds__day__last_value FROM cte_2 cte_2 GROUP BY cte_2.ds__martian_day - , cte_2.ds__martian_day__first_value - , cte_2.ds__martian_day__last_value + , cte_2.ds__day__first_value + , cte_2.ds__day__last_value ) subq_7 ) subq_8 ON diff --git a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Databricks/test_custom_offset_window_with_granularity_and_date_part__plan0_optimized.sql b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Databricks/test_custom_offset_window_with_granularity_and_date_part__plan0_optimized.sql index 4c8a6652b1..062fdbaa5d 100644 --- a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Databricks/test_custom_offset_window_with_granularity_and_date_part__plan0_optimized.sql +++ b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Databricks/test_custom_offset_window_with_granularity_and_date_part__plan0_optimized.sql @@ -31,12 +31,12 @@ FROM ( PARTITION BY martian_day ORDER BY ds ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) AS ds__martian_day__first_value + ) AS ds__day__first_value , LAST_VALUE(ds) OVER ( PARTITION BY martian_day ORDER BY ds ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) AS ds__martian_day__last_value + ) AS ds__day__last_value , ROW_NUMBER() OVER ( PARTITION BY martian_day ORDER BY ds @@ -47,8 +47,8 @@ FROM ( SELECT cte_6.ds__day AS ds__day , CASE - WHEN DATEADD(day, (cte_6.ds__day__row_number - 1), subq_25.ds__martian_day__first_value__lead) <= subq_25.ds__martian_day__last_value__lead - THEN DATEADD(day, (cte_6.ds__day__row_number - 1), subq_25.ds__martian_day__first_value__lead) + WHEN DATEADD(day, (cte_6.ds__day__row_number - 1), subq_25.ds__day__first_value__lead) <= subq_25.ds__day__last_value__lead + THEN DATEADD(day, (cte_6.ds__day__row_number - 1), subq_25.ds__day__first_value__lead) ELSE NULL END AS ds__day__lead FROM cte_6 cte_6 @@ -56,19 +56,19 @@ FROM ( -- Offset Custom Granularity Bounds SELECT ds__martian_day - , LEAD(ds__martian_day__first_value, 1) OVER (ORDER BY ds__martian_day) AS ds__martian_day__first_value__lead - , LEAD(ds__martian_day__last_value, 1) OVER (ORDER BY ds__martian_day) AS ds__martian_day__last_value__lead + , LEAD(ds__day__first_value, 1) OVER (ORDER BY ds__martian_day) AS ds__day__first_value__lead + , LEAD(ds__day__last_value, 1) OVER (ORDER BY ds__martian_day) AS ds__day__last_value__lead FROM ( -- Get Unique Rows for Custom Granularity Bounds SELECT ds__martian_day - , ds__martian_day__first_value - , ds__martian_day__last_value + , ds__day__first_value + , ds__day__last_value FROM cte_6 cte_6 GROUP BY ds__martian_day - , ds__martian_day__first_value - , ds__martian_day__last_value + , ds__day__first_value + , ds__day__last_value ) subq_24 ) subq_25 ON diff --git a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Databricks/test_custom_offset_window_with_multiple_time_spines__plan0.sql b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Databricks/test_custom_offset_window_with_multiple_time_spines__plan0.sql new file mode 100644 index 0000000000..f9a7eb3cfb --- /dev/null +++ b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Databricks/test_custom_offset_window_with_multiple_time_spines__plan0.sql @@ -0,0 +1,703 @@ +test_name: test_custom_offset_window_with_multiple_time_spines +test_filename: test_custom_granularity.py +sql_engine: Databricks +--- +-- Compute Metrics via Expressions +SELECT + subq_17.metric_time__hour + , archived_users AS archived_users_offset_1_martian_day +FROM ( + -- Compute Metrics via Expressions + SELECT + subq_16.metric_time__hour + , subq_16.archived_users + FROM ( + -- Aggregate Measures + SELECT + subq_15.metric_time__hour + , SUM(subq_15.archived_users) AS archived_users + FROM ( + -- Pass Only Elements: ['archived_users', 'metric_time__hour'] + SELECT + subq_14.metric_time__hour + , subq_14.archived_users + FROM ( + -- Join to Time Spine Dataset + SELECT + subq_13.metric_time__hour AS metric_time__hour + , subq_6.ds__day AS ds__day + , subq_6.ds__week AS ds__week + , subq_6.ds__month AS ds__month + , subq_6.ds__quarter AS ds__quarter + , subq_6.ds__year AS ds__year + , subq_6.ds__extract_year AS ds__extract_year + , subq_6.ds__extract_quarter AS ds__extract_quarter + , subq_6.ds__extract_month AS ds__extract_month + , subq_6.ds__extract_day AS ds__extract_day + , subq_6.ds__extract_dow AS ds__extract_dow + , subq_6.ds__extract_doy AS ds__extract_doy + , subq_6.created_at__day AS created_at__day + , subq_6.created_at__week AS created_at__week + , subq_6.created_at__month AS created_at__month + , subq_6.created_at__quarter AS created_at__quarter + , subq_6.created_at__year AS created_at__year + , subq_6.created_at__extract_year AS created_at__extract_year + , subq_6.created_at__extract_quarter AS created_at__extract_quarter + , subq_6.created_at__extract_month AS created_at__extract_month + , subq_6.created_at__extract_day AS created_at__extract_day + , subq_6.created_at__extract_dow AS created_at__extract_dow + , subq_6.created_at__extract_doy AS created_at__extract_doy + , subq_6.ds_partitioned__day AS ds_partitioned__day + , subq_6.ds_partitioned__week AS ds_partitioned__week + , subq_6.ds_partitioned__month AS ds_partitioned__month + , subq_6.ds_partitioned__quarter AS ds_partitioned__quarter + , subq_6.ds_partitioned__year AS ds_partitioned__year + , subq_6.ds_partitioned__extract_year AS ds_partitioned__extract_year + , subq_6.ds_partitioned__extract_quarter AS ds_partitioned__extract_quarter + , subq_6.ds_partitioned__extract_month AS ds_partitioned__extract_month + , subq_6.ds_partitioned__extract_day AS ds_partitioned__extract_day + , subq_6.ds_partitioned__extract_dow AS ds_partitioned__extract_dow + , subq_6.ds_partitioned__extract_doy AS ds_partitioned__extract_doy + , subq_6.last_profile_edit_ts__millisecond AS last_profile_edit_ts__millisecond + , subq_6.last_profile_edit_ts__second AS last_profile_edit_ts__second + , subq_6.last_profile_edit_ts__minute AS last_profile_edit_ts__minute + , subq_6.last_profile_edit_ts__hour AS last_profile_edit_ts__hour + , subq_6.last_profile_edit_ts__day AS last_profile_edit_ts__day + , subq_6.last_profile_edit_ts__week AS last_profile_edit_ts__week + , subq_6.last_profile_edit_ts__month AS last_profile_edit_ts__month + , subq_6.last_profile_edit_ts__quarter AS last_profile_edit_ts__quarter + , subq_6.last_profile_edit_ts__year AS last_profile_edit_ts__year + , subq_6.last_profile_edit_ts__extract_year AS last_profile_edit_ts__extract_year + , subq_6.last_profile_edit_ts__extract_quarter AS last_profile_edit_ts__extract_quarter + , subq_6.last_profile_edit_ts__extract_month AS last_profile_edit_ts__extract_month + , subq_6.last_profile_edit_ts__extract_day AS last_profile_edit_ts__extract_day + , subq_6.last_profile_edit_ts__extract_dow AS last_profile_edit_ts__extract_dow + , subq_6.last_profile_edit_ts__extract_doy AS last_profile_edit_ts__extract_doy + , subq_6.bio_added_ts__second AS bio_added_ts__second + , subq_6.bio_added_ts__minute AS bio_added_ts__minute + , subq_6.bio_added_ts__hour AS bio_added_ts__hour + , subq_6.bio_added_ts__day AS bio_added_ts__day + , subq_6.bio_added_ts__week AS bio_added_ts__week + , subq_6.bio_added_ts__month AS bio_added_ts__month + , subq_6.bio_added_ts__quarter AS bio_added_ts__quarter + , subq_6.bio_added_ts__year AS bio_added_ts__year + , subq_6.bio_added_ts__extract_year AS bio_added_ts__extract_year + , subq_6.bio_added_ts__extract_quarter AS bio_added_ts__extract_quarter + , subq_6.bio_added_ts__extract_month AS bio_added_ts__extract_month + , subq_6.bio_added_ts__extract_day AS bio_added_ts__extract_day + , subq_6.bio_added_ts__extract_dow AS bio_added_ts__extract_dow + , subq_6.bio_added_ts__extract_doy AS bio_added_ts__extract_doy + , subq_6.last_login_ts__minute AS last_login_ts__minute + , subq_6.last_login_ts__hour AS last_login_ts__hour + , subq_6.last_login_ts__day AS last_login_ts__day + , subq_6.last_login_ts__week AS last_login_ts__week + , subq_6.last_login_ts__month AS last_login_ts__month + , subq_6.last_login_ts__quarter AS last_login_ts__quarter + , subq_6.last_login_ts__year AS last_login_ts__year + , subq_6.last_login_ts__extract_year AS last_login_ts__extract_year + , subq_6.last_login_ts__extract_quarter AS last_login_ts__extract_quarter + , subq_6.last_login_ts__extract_month AS last_login_ts__extract_month + , subq_6.last_login_ts__extract_day AS last_login_ts__extract_day + , subq_6.last_login_ts__extract_dow AS last_login_ts__extract_dow + , subq_6.last_login_ts__extract_doy AS last_login_ts__extract_doy + , subq_6.archived_at__hour AS archived_at__hour + , subq_6.archived_at__day AS archived_at__day + , subq_6.archived_at__week AS archived_at__week + , subq_6.archived_at__month AS archived_at__month + , subq_6.archived_at__quarter AS archived_at__quarter + , subq_6.archived_at__year AS archived_at__year + , subq_6.archived_at__extract_year AS archived_at__extract_year + , subq_6.archived_at__extract_quarter AS archived_at__extract_quarter + , subq_6.archived_at__extract_month AS archived_at__extract_month + , subq_6.archived_at__extract_day AS archived_at__extract_day + , subq_6.archived_at__extract_dow AS archived_at__extract_dow + , subq_6.archived_at__extract_doy AS archived_at__extract_doy + , subq_6.user__ds__day AS user__ds__day + , subq_6.user__ds__week AS user__ds__week + , subq_6.user__ds__month AS user__ds__month + , subq_6.user__ds__quarter AS user__ds__quarter + , subq_6.user__ds__year AS user__ds__year + , subq_6.user__ds__extract_year AS user__ds__extract_year + , subq_6.user__ds__extract_quarter AS user__ds__extract_quarter + , subq_6.user__ds__extract_month AS user__ds__extract_month + , subq_6.user__ds__extract_day AS user__ds__extract_day + , subq_6.user__ds__extract_dow AS user__ds__extract_dow + , subq_6.user__ds__extract_doy AS user__ds__extract_doy + , subq_6.user__created_at__day AS user__created_at__day + , subq_6.user__created_at__week AS user__created_at__week + , subq_6.user__created_at__month AS user__created_at__month + , subq_6.user__created_at__quarter AS user__created_at__quarter + , subq_6.user__created_at__year AS user__created_at__year + , subq_6.user__created_at__extract_year AS user__created_at__extract_year + , subq_6.user__created_at__extract_quarter AS user__created_at__extract_quarter + , subq_6.user__created_at__extract_month AS user__created_at__extract_month + , subq_6.user__created_at__extract_day AS user__created_at__extract_day + , subq_6.user__created_at__extract_dow AS user__created_at__extract_dow + , subq_6.user__created_at__extract_doy AS user__created_at__extract_doy + , subq_6.user__ds_partitioned__day AS user__ds_partitioned__day + , subq_6.user__ds_partitioned__week AS user__ds_partitioned__week + , subq_6.user__ds_partitioned__month AS user__ds_partitioned__month + , subq_6.user__ds_partitioned__quarter AS user__ds_partitioned__quarter + , subq_6.user__ds_partitioned__year AS user__ds_partitioned__year + , subq_6.user__ds_partitioned__extract_year AS user__ds_partitioned__extract_year + , subq_6.user__ds_partitioned__extract_quarter AS user__ds_partitioned__extract_quarter + , subq_6.user__ds_partitioned__extract_month AS user__ds_partitioned__extract_month + , subq_6.user__ds_partitioned__extract_day AS user__ds_partitioned__extract_day + , subq_6.user__ds_partitioned__extract_dow AS user__ds_partitioned__extract_dow + , subq_6.user__ds_partitioned__extract_doy AS user__ds_partitioned__extract_doy + , subq_6.user__last_profile_edit_ts__millisecond AS user__last_profile_edit_ts__millisecond + , subq_6.user__last_profile_edit_ts__second AS user__last_profile_edit_ts__second + , subq_6.user__last_profile_edit_ts__minute AS user__last_profile_edit_ts__minute + , subq_6.user__last_profile_edit_ts__hour AS user__last_profile_edit_ts__hour + , subq_6.user__last_profile_edit_ts__day AS user__last_profile_edit_ts__day + , subq_6.user__last_profile_edit_ts__week AS user__last_profile_edit_ts__week + , subq_6.user__last_profile_edit_ts__month AS user__last_profile_edit_ts__month + , subq_6.user__last_profile_edit_ts__quarter AS user__last_profile_edit_ts__quarter + , subq_6.user__last_profile_edit_ts__year AS user__last_profile_edit_ts__year + , subq_6.user__last_profile_edit_ts__extract_year AS user__last_profile_edit_ts__extract_year + , subq_6.user__last_profile_edit_ts__extract_quarter AS user__last_profile_edit_ts__extract_quarter + , subq_6.user__last_profile_edit_ts__extract_month AS user__last_profile_edit_ts__extract_month + , subq_6.user__last_profile_edit_ts__extract_day AS user__last_profile_edit_ts__extract_day + , subq_6.user__last_profile_edit_ts__extract_dow AS user__last_profile_edit_ts__extract_dow + , subq_6.user__last_profile_edit_ts__extract_doy AS user__last_profile_edit_ts__extract_doy + , subq_6.user__bio_added_ts__second AS user__bio_added_ts__second + , subq_6.user__bio_added_ts__minute AS user__bio_added_ts__minute + , subq_6.user__bio_added_ts__hour AS user__bio_added_ts__hour + , subq_6.user__bio_added_ts__day AS user__bio_added_ts__day + , subq_6.user__bio_added_ts__week AS user__bio_added_ts__week + , subq_6.user__bio_added_ts__month AS user__bio_added_ts__month + , subq_6.user__bio_added_ts__quarter AS user__bio_added_ts__quarter + , subq_6.user__bio_added_ts__year AS user__bio_added_ts__year + , subq_6.user__bio_added_ts__extract_year AS user__bio_added_ts__extract_year + , subq_6.user__bio_added_ts__extract_quarter AS user__bio_added_ts__extract_quarter + , subq_6.user__bio_added_ts__extract_month AS user__bio_added_ts__extract_month + , subq_6.user__bio_added_ts__extract_day AS user__bio_added_ts__extract_day + , subq_6.user__bio_added_ts__extract_dow AS user__bio_added_ts__extract_dow + , subq_6.user__bio_added_ts__extract_doy AS user__bio_added_ts__extract_doy + , subq_6.user__last_login_ts__minute AS user__last_login_ts__minute + , subq_6.user__last_login_ts__hour AS user__last_login_ts__hour + , subq_6.user__last_login_ts__day AS user__last_login_ts__day + , subq_6.user__last_login_ts__week AS user__last_login_ts__week + , subq_6.user__last_login_ts__month AS user__last_login_ts__month + , subq_6.user__last_login_ts__quarter AS user__last_login_ts__quarter + , subq_6.user__last_login_ts__year AS user__last_login_ts__year + , subq_6.user__last_login_ts__extract_year AS user__last_login_ts__extract_year + , subq_6.user__last_login_ts__extract_quarter AS user__last_login_ts__extract_quarter + , subq_6.user__last_login_ts__extract_month AS user__last_login_ts__extract_month + , subq_6.user__last_login_ts__extract_day AS user__last_login_ts__extract_day + , subq_6.user__last_login_ts__extract_dow AS user__last_login_ts__extract_dow + , subq_6.user__last_login_ts__extract_doy AS user__last_login_ts__extract_doy + , subq_6.user__archived_at__hour AS user__archived_at__hour + , subq_6.user__archived_at__day AS user__archived_at__day + , subq_6.user__archived_at__week AS user__archived_at__week + , subq_6.user__archived_at__month AS user__archived_at__month + , subq_6.user__archived_at__quarter AS user__archived_at__quarter + , subq_6.user__archived_at__year AS user__archived_at__year + , subq_6.user__archived_at__extract_year AS user__archived_at__extract_year + , subq_6.user__archived_at__extract_quarter AS user__archived_at__extract_quarter + , subq_6.user__archived_at__extract_month AS user__archived_at__extract_month + , subq_6.user__archived_at__extract_day AS user__archived_at__extract_day + , subq_6.user__archived_at__extract_dow AS user__archived_at__extract_dow + , subq_6.user__archived_at__extract_doy AS user__archived_at__extract_doy + , subq_6.metric_time__day AS metric_time__day + , subq_6.metric_time__week AS metric_time__week + , subq_6.metric_time__month AS metric_time__month + , subq_6.metric_time__quarter AS metric_time__quarter + , subq_6.metric_time__year AS metric_time__year + , subq_6.metric_time__extract_year AS metric_time__extract_year + , subq_6.metric_time__extract_quarter AS metric_time__extract_quarter + , subq_6.metric_time__extract_month AS metric_time__extract_month + , subq_6.metric_time__extract_day AS metric_time__extract_day + , subq_6.metric_time__extract_dow AS metric_time__extract_dow + , subq_6.metric_time__extract_doy AS metric_time__extract_doy + , subq_6.user AS user + , subq_6.home_state AS home_state + , subq_6.user__home_state AS user__home_state + , subq_6.archived_users AS archived_users + FROM ( + -- Pass Only Elements: ['ts__hour', 'metric_time__hour'] + SELECT + subq_12.ts__hour + , subq_12.metric_time__hour + FROM ( + -- Apply Requested Granularities + SELECT + subq_11.ts__hour + , subq_11.ts__hour__lead AS metric_time__hour + FROM ( + -- Offset Base Granularity By Custom Granularity Period(s) + WITH cte_2 AS ( + -- Get Custom Granularity Bounds + SELECT + subq_8.ts__hour AS ts__hour + , subq_7.ds__martian_day AS ds__martian_day + , FIRST_VALUE(subq_8.ts__hour) OVER ( + PARTITION BY subq_7.ds__martian_day + ORDER BY subq_8.ts__hour + ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING + ) AS ts__hour__first_value + , LAST_VALUE(subq_8.ts__hour) OVER ( + PARTITION BY subq_7.ds__martian_day + ORDER BY subq_8.ts__hour + ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING + ) AS ts__hour__last_value + , ROW_NUMBER() OVER ( + PARTITION BY subq_7.ds__martian_day + ORDER BY subq_8.ts__hour + ) AS ts__hour__row_number + FROM ( + -- Read From Time Spine 'mf_time_spine' + SELECT + time_spine_src_28006.ds AS ds__day + , DATE_TRUNC('week', time_spine_src_28006.ds) AS ds__week + , DATE_TRUNC('month', time_spine_src_28006.ds) AS ds__month + , DATE_TRUNC('quarter', time_spine_src_28006.ds) AS ds__quarter + , DATE_TRUNC('year', time_spine_src_28006.ds) AS ds__year + , EXTRACT(year FROM time_spine_src_28006.ds) AS ds__extract_year + , EXTRACT(quarter FROM time_spine_src_28006.ds) AS ds__extract_quarter + , EXTRACT(month FROM time_spine_src_28006.ds) AS ds__extract_month + , EXTRACT(day FROM time_spine_src_28006.ds) AS ds__extract_day + , EXTRACT(DAYOFWEEK_ISO FROM time_spine_src_28006.ds) AS ds__extract_dow + , EXTRACT(doy FROM time_spine_src_28006.ds) AS ds__extract_doy + , time_spine_src_28006.martian_day AS ds__martian_day + FROM ***************************.mf_time_spine time_spine_src_28006 + ) subq_7 + INNER JOIN ( + -- Read From Time Spine 'mf_time_spine_hour' + SELECT + time_spine_src_28005.ts AS ts__hour + , DATE_TRUNC('day', time_spine_src_28005.ts) AS ts__day + , DATE_TRUNC('week', time_spine_src_28005.ts) AS ts__week + , DATE_TRUNC('month', time_spine_src_28005.ts) AS ts__month + , DATE_TRUNC('quarter', time_spine_src_28005.ts) AS ts__quarter + , DATE_TRUNC('year', time_spine_src_28005.ts) AS ts__year + , EXTRACT(year FROM time_spine_src_28005.ts) AS ts__extract_year + , EXTRACT(quarter FROM time_spine_src_28005.ts) AS ts__extract_quarter + , EXTRACT(month FROM time_spine_src_28005.ts) AS ts__extract_month + , EXTRACT(day FROM time_spine_src_28005.ts) AS ts__extract_day + , EXTRACT(DAYOFWEEK_ISO FROM time_spine_src_28005.ts) AS ts__extract_dow + , EXTRACT(doy FROM time_spine_src_28005.ts) AS ts__extract_doy + FROM ***************************.mf_time_spine_hour time_spine_src_28005 + ) subq_8 + ON + subq_7.ds__day = subq_8.ts__day + ) + + SELECT + cte_2.ts__hour AS ts__hour + , CASE + WHEN DATEADD(hour, (cte_2.ts__hour__row_number - 1), subq_10.ts__hour__first_value__lead) <= subq_10.ts__hour__last_value__lead + THEN DATEADD(hour, (cte_2.ts__hour__row_number - 1), subq_10.ts__hour__first_value__lead) + ELSE NULL + END AS ts__hour__lead + FROM cte_2 cte_2 + INNER JOIN ( + -- Offset Custom Granularity Bounds + SELECT + subq_9.ds__martian_day + , LEAD(subq_9.ts__hour__first_value, 1) OVER (ORDER BY subq_9.ds__martian_day) AS ts__hour__first_value__lead + , LEAD(subq_9.ts__hour__last_value, 1) OVER (ORDER BY subq_9.ds__martian_day) AS ts__hour__last_value__lead + FROM ( + -- Get Unique Rows for Custom Granularity Bounds + SELECT + cte_2.ds__martian_day + , cte_2.ts__hour__first_value + , cte_2.ts__hour__last_value + FROM cte_2 cte_2 + GROUP BY + cte_2.ds__martian_day + , cte_2.ts__hour__first_value + , cte_2.ts__hour__last_value + ) subq_9 + ) subq_10 + ON + cte_2.ds__martian_day = subq_10.ds__martian_day + ) subq_11 + ) subq_12 + ) subq_13 + INNER JOIN ( + -- Metric Time Dimension 'archived_at' + SELECT + subq_5.ds__day + , subq_5.ds__week + , subq_5.ds__month + , subq_5.ds__quarter + , subq_5.ds__year + , subq_5.ds__extract_year + , subq_5.ds__extract_quarter + , subq_5.ds__extract_month + , subq_5.ds__extract_day + , subq_5.ds__extract_dow + , subq_5.ds__extract_doy + , subq_5.created_at__day + , subq_5.created_at__week + , subq_5.created_at__month + , subq_5.created_at__quarter + , subq_5.created_at__year + , subq_5.created_at__extract_year + , subq_5.created_at__extract_quarter + , subq_5.created_at__extract_month + , subq_5.created_at__extract_day + , subq_5.created_at__extract_dow + , subq_5.created_at__extract_doy + , subq_5.ds_partitioned__day + , subq_5.ds_partitioned__week + , subq_5.ds_partitioned__month + , subq_5.ds_partitioned__quarter + , subq_5.ds_partitioned__year + , subq_5.ds_partitioned__extract_year + , subq_5.ds_partitioned__extract_quarter + , subq_5.ds_partitioned__extract_month + , subq_5.ds_partitioned__extract_day + , subq_5.ds_partitioned__extract_dow + , subq_5.ds_partitioned__extract_doy + , subq_5.last_profile_edit_ts__millisecond + , subq_5.last_profile_edit_ts__second + , subq_5.last_profile_edit_ts__minute + , subq_5.last_profile_edit_ts__hour + , subq_5.last_profile_edit_ts__day + , subq_5.last_profile_edit_ts__week + , subq_5.last_profile_edit_ts__month + , subq_5.last_profile_edit_ts__quarter + , subq_5.last_profile_edit_ts__year + , subq_5.last_profile_edit_ts__extract_year + , subq_5.last_profile_edit_ts__extract_quarter + , subq_5.last_profile_edit_ts__extract_month + , subq_5.last_profile_edit_ts__extract_day + , subq_5.last_profile_edit_ts__extract_dow + , subq_5.last_profile_edit_ts__extract_doy + , subq_5.bio_added_ts__second + , subq_5.bio_added_ts__minute + , subq_5.bio_added_ts__hour + , subq_5.bio_added_ts__day + , subq_5.bio_added_ts__week + , subq_5.bio_added_ts__month + , subq_5.bio_added_ts__quarter + , subq_5.bio_added_ts__year + , subq_5.bio_added_ts__extract_year + , subq_5.bio_added_ts__extract_quarter + , subq_5.bio_added_ts__extract_month + , subq_5.bio_added_ts__extract_day + , subq_5.bio_added_ts__extract_dow + , subq_5.bio_added_ts__extract_doy + , subq_5.last_login_ts__minute + , subq_5.last_login_ts__hour + , subq_5.last_login_ts__day + , subq_5.last_login_ts__week + , subq_5.last_login_ts__month + , subq_5.last_login_ts__quarter + , subq_5.last_login_ts__year + , subq_5.last_login_ts__extract_year + , subq_5.last_login_ts__extract_quarter + , subq_5.last_login_ts__extract_month + , subq_5.last_login_ts__extract_day + , subq_5.last_login_ts__extract_dow + , subq_5.last_login_ts__extract_doy + , subq_5.archived_at__hour + , subq_5.archived_at__day + , subq_5.archived_at__week + , subq_5.archived_at__month + , subq_5.archived_at__quarter + , subq_5.archived_at__year + , subq_5.archived_at__extract_year + , subq_5.archived_at__extract_quarter + , subq_5.archived_at__extract_month + , subq_5.archived_at__extract_day + , subq_5.archived_at__extract_dow + , subq_5.archived_at__extract_doy + , subq_5.user__ds__day + , subq_5.user__ds__week + , subq_5.user__ds__month + , subq_5.user__ds__quarter + , subq_5.user__ds__year + , subq_5.user__ds__extract_year + , subq_5.user__ds__extract_quarter + , subq_5.user__ds__extract_month + , subq_5.user__ds__extract_day + , subq_5.user__ds__extract_dow + , subq_5.user__ds__extract_doy + , subq_5.user__created_at__day + , subq_5.user__created_at__week + , subq_5.user__created_at__month + , subq_5.user__created_at__quarter + , subq_5.user__created_at__year + , subq_5.user__created_at__extract_year + , subq_5.user__created_at__extract_quarter + , subq_5.user__created_at__extract_month + , subq_5.user__created_at__extract_day + , subq_5.user__created_at__extract_dow + , subq_5.user__created_at__extract_doy + , subq_5.user__ds_partitioned__day + , subq_5.user__ds_partitioned__week + , subq_5.user__ds_partitioned__month + , subq_5.user__ds_partitioned__quarter + , subq_5.user__ds_partitioned__year + , subq_5.user__ds_partitioned__extract_year + , subq_5.user__ds_partitioned__extract_quarter + , subq_5.user__ds_partitioned__extract_month + , subq_5.user__ds_partitioned__extract_day + , subq_5.user__ds_partitioned__extract_dow + , subq_5.user__ds_partitioned__extract_doy + , subq_5.user__last_profile_edit_ts__millisecond + , subq_5.user__last_profile_edit_ts__second + , subq_5.user__last_profile_edit_ts__minute + , subq_5.user__last_profile_edit_ts__hour + , subq_5.user__last_profile_edit_ts__day + , subq_5.user__last_profile_edit_ts__week + , subq_5.user__last_profile_edit_ts__month + , subq_5.user__last_profile_edit_ts__quarter + , subq_5.user__last_profile_edit_ts__year + , subq_5.user__last_profile_edit_ts__extract_year + , subq_5.user__last_profile_edit_ts__extract_quarter + , subq_5.user__last_profile_edit_ts__extract_month + , subq_5.user__last_profile_edit_ts__extract_day + , subq_5.user__last_profile_edit_ts__extract_dow + , subq_5.user__last_profile_edit_ts__extract_doy + , subq_5.user__bio_added_ts__second + , subq_5.user__bio_added_ts__minute + , subq_5.user__bio_added_ts__hour + , subq_5.user__bio_added_ts__day + , subq_5.user__bio_added_ts__week + , subq_5.user__bio_added_ts__month + , subq_5.user__bio_added_ts__quarter + , subq_5.user__bio_added_ts__year + , subq_5.user__bio_added_ts__extract_year + , subq_5.user__bio_added_ts__extract_quarter + , subq_5.user__bio_added_ts__extract_month + , subq_5.user__bio_added_ts__extract_day + , subq_5.user__bio_added_ts__extract_dow + , subq_5.user__bio_added_ts__extract_doy + , subq_5.user__last_login_ts__minute + , subq_5.user__last_login_ts__hour + , subq_5.user__last_login_ts__day + , subq_5.user__last_login_ts__week + , subq_5.user__last_login_ts__month + , subq_5.user__last_login_ts__quarter + , subq_5.user__last_login_ts__year + , subq_5.user__last_login_ts__extract_year + , subq_5.user__last_login_ts__extract_quarter + , subq_5.user__last_login_ts__extract_month + , subq_5.user__last_login_ts__extract_day + , subq_5.user__last_login_ts__extract_dow + , subq_5.user__last_login_ts__extract_doy + , subq_5.user__archived_at__hour + , subq_5.user__archived_at__day + , subq_5.user__archived_at__week + , subq_5.user__archived_at__month + , subq_5.user__archived_at__quarter + , subq_5.user__archived_at__year + , subq_5.user__archived_at__extract_year + , subq_5.user__archived_at__extract_quarter + , subq_5.user__archived_at__extract_month + , subq_5.user__archived_at__extract_day + , subq_5.user__archived_at__extract_dow + , subq_5.user__archived_at__extract_doy + , subq_5.archived_at__hour AS metric_time__hour + , subq_5.archived_at__day AS metric_time__day + , subq_5.archived_at__week AS metric_time__week + , subq_5.archived_at__month AS metric_time__month + , subq_5.archived_at__quarter AS metric_time__quarter + , subq_5.archived_at__year AS metric_time__year + , subq_5.archived_at__extract_year AS metric_time__extract_year + , subq_5.archived_at__extract_quarter AS metric_time__extract_quarter + , subq_5.archived_at__extract_month AS metric_time__extract_month + , subq_5.archived_at__extract_day AS metric_time__extract_day + , subq_5.archived_at__extract_dow AS metric_time__extract_dow + , subq_5.archived_at__extract_doy AS metric_time__extract_doy + , subq_5.user + , subq_5.home_state + , subq_5.user__home_state + , subq_5.archived_users + FROM ( + -- Read Elements From Semantic Model 'users_ds_source' + SELECT + 1 AS new_users + , 1 AS archived_users + , DATE_TRUNC('day', users_ds_source_src_28000.ds) AS ds__day + , DATE_TRUNC('week', users_ds_source_src_28000.ds) AS ds__week + , DATE_TRUNC('month', users_ds_source_src_28000.ds) AS ds__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.ds) AS ds__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.ds) AS ds__year + , EXTRACT(year FROM users_ds_source_src_28000.ds) AS ds__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.ds) AS ds__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.ds) AS ds__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.ds) AS ds__extract_day + , EXTRACT(DAYOFWEEK_ISO FROM users_ds_source_src_28000.ds) AS ds__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.ds) AS ds__extract_doy + , DATE_TRUNC('day', users_ds_source_src_28000.created_at) AS created_at__day + , DATE_TRUNC('week', users_ds_source_src_28000.created_at) AS created_at__week + , DATE_TRUNC('month', users_ds_source_src_28000.created_at) AS created_at__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.created_at) AS created_at__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.created_at) AS created_at__year + , EXTRACT(year FROM users_ds_source_src_28000.created_at) AS created_at__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.created_at) AS created_at__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.created_at) AS created_at__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.created_at) AS created_at__extract_day + , EXTRACT(DAYOFWEEK_ISO FROM users_ds_source_src_28000.created_at) AS created_at__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.created_at) AS created_at__extract_doy + , DATE_TRUNC('day', users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__day + , DATE_TRUNC('week', users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__week + , DATE_TRUNC('month', users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__year + , EXTRACT(year FROM users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__extract_day + , EXTRACT(DAYOFWEEK_ISO FROM users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__extract_doy + , users_ds_source_src_28000.home_state + , DATE_TRUNC('millisecond', users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__millisecond + , DATE_TRUNC('second', users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__second + , DATE_TRUNC('minute', users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__minute + , DATE_TRUNC('hour', users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__hour + , DATE_TRUNC('day', users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__day + , DATE_TRUNC('week', users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__week + , DATE_TRUNC('month', users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__year + , EXTRACT(year FROM users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__extract_day + , EXTRACT(DAYOFWEEK_ISO FROM users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__extract_doy + , DATE_TRUNC('second', users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__second + , DATE_TRUNC('minute', users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__minute + , DATE_TRUNC('hour', users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__hour + , DATE_TRUNC('day', users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__day + , DATE_TRUNC('week', users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__week + , DATE_TRUNC('month', users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__year + , EXTRACT(year FROM users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__extract_day + , EXTRACT(DAYOFWEEK_ISO FROM users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__extract_doy + , DATE_TRUNC('minute', users_ds_source_src_28000.last_login_ts) AS last_login_ts__minute + , DATE_TRUNC('hour', users_ds_source_src_28000.last_login_ts) AS last_login_ts__hour + , DATE_TRUNC('day', users_ds_source_src_28000.last_login_ts) AS last_login_ts__day + , DATE_TRUNC('week', users_ds_source_src_28000.last_login_ts) AS last_login_ts__week + , DATE_TRUNC('month', users_ds_source_src_28000.last_login_ts) AS last_login_ts__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.last_login_ts) AS last_login_ts__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.last_login_ts) AS last_login_ts__year + , EXTRACT(year FROM users_ds_source_src_28000.last_login_ts) AS last_login_ts__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.last_login_ts) AS last_login_ts__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.last_login_ts) AS last_login_ts__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.last_login_ts) AS last_login_ts__extract_day + , EXTRACT(DAYOFWEEK_ISO FROM users_ds_source_src_28000.last_login_ts) AS last_login_ts__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.last_login_ts) AS last_login_ts__extract_doy + , DATE_TRUNC('hour', users_ds_source_src_28000.archived_at) AS archived_at__hour + , DATE_TRUNC('day', users_ds_source_src_28000.archived_at) AS archived_at__day + , DATE_TRUNC('week', users_ds_source_src_28000.archived_at) AS archived_at__week + , DATE_TRUNC('month', users_ds_source_src_28000.archived_at) AS archived_at__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.archived_at) AS archived_at__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.archived_at) AS archived_at__year + , EXTRACT(year FROM users_ds_source_src_28000.archived_at) AS archived_at__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.archived_at) AS archived_at__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.archived_at) AS archived_at__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.archived_at) AS archived_at__extract_day + , EXTRACT(DAYOFWEEK_ISO FROM users_ds_source_src_28000.archived_at) AS archived_at__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.archived_at) AS archived_at__extract_doy + , DATE_TRUNC('day', users_ds_source_src_28000.ds) AS user__ds__day + , DATE_TRUNC('week', users_ds_source_src_28000.ds) AS user__ds__week + , DATE_TRUNC('month', users_ds_source_src_28000.ds) AS user__ds__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.ds) AS user__ds__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.ds) AS user__ds__year + , EXTRACT(year FROM users_ds_source_src_28000.ds) AS user__ds__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.ds) AS user__ds__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.ds) AS user__ds__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.ds) AS user__ds__extract_day + , EXTRACT(DAYOFWEEK_ISO FROM users_ds_source_src_28000.ds) AS user__ds__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.ds) AS user__ds__extract_doy + , DATE_TRUNC('day', users_ds_source_src_28000.created_at) AS user__created_at__day + , DATE_TRUNC('week', users_ds_source_src_28000.created_at) AS user__created_at__week + , DATE_TRUNC('month', users_ds_source_src_28000.created_at) AS user__created_at__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.created_at) AS user__created_at__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.created_at) AS user__created_at__year + , EXTRACT(year FROM users_ds_source_src_28000.created_at) AS user__created_at__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.created_at) AS user__created_at__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.created_at) AS user__created_at__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.created_at) AS user__created_at__extract_day + , EXTRACT(DAYOFWEEK_ISO FROM users_ds_source_src_28000.created_at) AS user__created_at__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.created_at) AS user__created_at__extract_doy + , DATE_TRUNC('day', users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__day + , DATE_TRUNC('week', users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__week + , DATE_TRUNC('month', users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__year + , EXTRACT(year FROM users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__extract_day + , EXTRACT(DAYOFWEEK_ISO FROM users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__extract_doy + , users_ds_source_src_28000.home_state AS user__home_state + , DATE_TRUNC('millisecond', users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__millisecond + , DATE_TRUNC('second', users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__second + , DATE_TRUNC('minute', users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__minute + , DATE_TRUNC('hour', users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__hour + , DATE_TRUNC('day', users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__day + , DATE_TRUNC('week', users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__week + , DATE_TRUNC('month', users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__year + , EXTRACT(year FROM users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__extract_day + , EXTRACT(DAYOFWEEK_ISO FROM users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__extract_doy + , DATE_TRUNC('second', users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__second + , DATE_TRUNC('minute', users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__minute + , DATE_TRUNC('hour', users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__hour + , DATE_TRUNC('day', users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__day + , DATE_TRUNC('week', users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__week + , DATE_TRUNC('month', users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__year + , EXTRACT(year FROM users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__extract_day + , EXTRACT(DAYOFWEEK_ISO FROM users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__extract_doy + , DATE_TRUNC('minute', users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__minute + , DATE_TRUNC('hour', users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__hour + , DATE_TRUNC('day', users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__day + , DATE_TRUNC('week', users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__week + , DATE_TRUNC('month', users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__year + , EXTRACT(year FROM users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__extract_day + , EXTRACT(DAYOFWEEK_ISO FROM users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__extract_doy + , DATE_TRUNC('hour', users_ds_source_src_28000.archived_at) AS user__archived_at__hour + , DATE_TRUNC('day', users_ds_source_src_28000.archived_at) AS user__archived_at__day + , DATE_TRUNC('week', users_ds_source_src_28000.archived_at) AS user__archived_at__week + , DATE_TRUNC('month', users_ds_source_src_28000.archived_at) AS user__archived_at__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.archived_at) AS user__archived_at__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.archived_at) AS user__archived_at__year + , EXTRACT(year FROM users_ds_source_src_28000.archived_at) AS user__archived_at__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.archived_at) AS user__archived_at__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.archived_at) AS user__archived_at__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.archived_at) AS user__archived_at__extract_day + , EXTRACT(DAYOFWEEK_ISO FROM users_ds_source_src_28000.archived_at) AS user__archived_at__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.archived_at) AS user__archived_at__extract_doy + , users_ds_source_src_28000.user_id AS user + FROM ***************************.dim_users users_ds_source_src_28000 + ) subq_5 + ) subq_6 + ON + subq_13.ts__hour = subq_6.metric_time__hour + ) subq_14 + ) subq_15 + GROUP BY + subq_15.metric_time__hour + ) subq_16 +) subq_17 diff --git a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Databricks/test_custom_offset_window_with_multiple_time_spines__plan0_optimized.sql b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Databricks/test_custom_offset_window_with_multiple_time_spines__plan0_optimized.sql new file mode 100644 index 0000000000..c79047f831 --- /dev/null +++ b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Databricks/test_custom_offset_window_with_multiple_time_spines__plan0_optimized.sql @@ -0,0 +1,87 @@ +test_name: test_custom_offset_window_with_multiple_time_spines +test_filename: test_custom_granularity.py +sql_engine: Databricks +--- +-- Compute Metrics via Expressions +SELECT + metric_time__hour + , archived_users AS archived_users_offset_1_martian_day +FROM ( + -- Join to Time Spine Dataset + -- Pass Only Elements: ['archived_users', 'metric_time__hour'] + -- Aggregate Measures + -- Compute Metrics via Expressions + SELECT + subq_29.ts__hour__lead AS metric_time__hour + , SUM(subq_24.archived_users) AS archived_users + FROM ( + -- Offset Base Granularity By Custom Granularity Period(s) + WITH cte_6 AS ( + -- Get Custom Granularity Bounds + SELECT + time_spine_src_28005.ts AS ts__hour + , time_spine_src_28006.martian_day AS ds__martian_day + , FIRST_VALUE(time_spine_src_28005.ts) OVER ( + PARTITION BY time_spine_src_28006.martian_day + ORDER BY time_spine_src_28005.ts + ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING + ) AS ts__hour__first_value + , LAST_VALUE(time_spine_src_28005.ts) OVER ( + PARTITION BY time_spine_src_28006.martian_day + ORDER BY time_spine_src_28005.ts + ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING + ) AS ts__hour__last_value + , ROW_NUMBER() OVER ( + PARTITION BY time_spine_src_28006.martian_day + ORDER BY time_spine_src_28005.ts + ) AS ts__hour__row_number + FROM ***************************.mf_time_spine time_spine_src_28006 + INNER JOIN + ***************************.mf_time_spine_hour time_spine_src_28005 + ON + time_spine_src_28006.ds = DATE_TRUNC('day', time_spine_src_28005.ts) + ) + + SELECT + cte_6.ts__hour AS ts__hour + , CASE + WHEN DATEADD(hour, (cte_6.ts__hour__row_number - 1), subq_28.ts__hour__first_value__lead) <= subq_28.ts__hour__last_value__lead + THEN DATEADD(hour, (cte_6.ts__hour__row_number - 1), subq_28.ts__hour__first_value__lead) + ELSE NULL + END AS ts__hour__lead + FROM cte_6 cte_6 + INNER JOIN ( + -- Offset Custom Granularity Bounds + SELECT + ds__martian_day + , LEAD(ts__hour__first_value, 1) OVER (ORDER BY ds__martian_day) AS ts__hour__first_value__lead + , LEAD(ts__hour__last_value, 1) OVER (ORDER BY ds__martian_day) AS ts__hour__last_value__lead + FROM ( + -- Get Unique Rows for Custom Granularity Bounds + SELECT + ds__martian_day + , ts__hour__first_value + , ts__hour__last_value + FROM cte_6 cte_6 + GROUP BY + ds__martian_day + , ts__hour__first_value + , ts__hour__last_value + ) subq_27 + ) subq_28 + ON + cte_6.ds__martian_day = subq_28.ds__martian_day + ) subq_29 + INNER JOIN ( + -- Read Elements From Semantic Model 'users_ds_source' + -- Metric Time Dimension 'archived_at' + SELECT + DATE_TRUNC('hour', archived_at) AS metric_time__hour + , 1 AS archived_users + FROM ***************************.dim_users users_ds_source_src_28000 + ) subq_24 + ON + subq_29.ts__hour = subq_24.metric_time__hour + GROUP BY + subq_29.ts__hour__lead +) subq_35 diff --git a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Postgres/test_custom_offset_window__plan0.sql b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Postgres/test_custom_offset_window__plan0.sql index c2124e82e4..4fc3999bc8 100644 --- a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Postgres/test_custom_offset_window__plan0.sql +++ b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Postgres/test_custom_offset_window__plan0.sql @@ -137,28 +137,18 @@ FROM ( WITH cte_2 AS ( -- Get Custom Granularity Bounds SELECT - time_spine_src_28006.ds AS ds__day - , DATE_TRUNC('week', time_spine_src_28006.ds) AS ds__week - , DATE_TRUNC('month', time_spine_src_28006.ds) AS ds__month - , DATE_TRUNC('quarter', time_spine_src_28006.ds) AS ds__quarter - , DATE_TRUNC('year', time_spine_src_28006.ds) AS ds__year - , EXTRACT(year FROM time_spine_src_28006.ds) AS ds__extract_year - , EXTRACT(quarter FROM time_spine_src_28006.ds) AS ds__extract_quarter - , EXTRACT(month FROM time_spine_src_28006.ds) AS ds__extract_month - , EXTRACT(day FROM time_spine_src_28006.ds) AS ds__extract_day - , EXTRACT(isodow FROM time_spine_src_28006.ds) AS ds__extract_dow - , EXTRACT(doy FROM time_spine_src_28006.ds) AS ds__extract_doy - , time_spine_src_28006.martian_day AS ds__martian_day + subq_6.ds__day + , subq_6.ds__martian_day , FIRST_VALUE(subq_6.ds__day) OVER ( PARTITION BY subq_6.ds__martian_day ORDER BY subq_6.ds__day ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) AS ds__martian_day__first_value + ) AS ds__day__first_value , LAST_VALUE(subq_6.ds__day) OVER ( PARTITION BY subq_6.ds__martian_day ORDER BY subq_6.ds__day ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) AS ds__martian_day__last_value + ) AS ds__day__last_value , ROW_NUMBER() OVER ( PARTITION BY subq_6.ds__martian_day ORDER BY subq_6.ds__day @@ -185,8 +175,8 @@ FROM ( SELECT cte_2.ds__day AS ds__day , CASE - WHEN subq_8.ds__martian_day__first_value__lead + MAKE_INTERVAL(days => CAST ((cte_2.ds__day__row_number - 1) AS INTEGER)) <= subq_8.ds__martian_day__last_value__lead - THEN subq_8.ds__martian_day__first_value__lead + MAKE_INTERVAL(days => CAST ((cte_2.ds__day__row_number - 1) AS INTEGER)) + WHEN subq_8.ds__day__first_value__lead + MAKE_INTERVAL(days => CAST ((cte_2.ds__day__row_number - 1) AS INTEGER)) <= subq_8.ds__day__last_value__lead + THEN subq_8.ds__day__first_value__lead + MAKE_INTERVAL(days => CAST ((cte_2.ds__day__row_number - 1) AS INTEGER)) ELSE NULL END AS ds__day__lead FROM cte_2 cte_2 @@ -194,19 +184,19 @@ FROM ( -- Offset Custom Granularity Bounds SELECT subq_7.ds__martian_day - , LEAD(subq_7.ds__martian_day__first_value, 1) OVER (ORDER BY subq_7.ds__martian_day) AS ds__martian_day__first_value__lead - , LEAD(subq_7.ds__martian_day__last_value, 1) OVER (ORDER BY subq_7.ds__martian_day) AS ds__martian_day__last_value__lead + , LEAD(subq_7.ds__day__first_value, 1) OVER (ORDER BY subq_7.ds__martian_day) AS ds__day__first_value__lead + , LEAD(subq_7.ds__day__last_value, 1) OVER (ORDER BY subq_7.ds__martian_day) AS ds__day__last_value__lead FROM ( -- Get Unique Rows for Custom Granularity Bounds SELECT cte_2.ds__martian_day - , cte_2.ds__martian_day__first_value - , cte_2.ds__martian_day__last_value + , cte_2.ds__day__first_value + , cte_2.ds__day__last_value FROM cte_2 cte_2 GROUP BY cte_2.ds__martian_day - , cte_2.ds__martian_day__first_value - , cte_2.ds__martian_day__last_value + , cte_2.ds__day__first_value + , cte_2.ds__day__last_value ) subq_7 ) subq_8 ON diff --git a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Postgres/test_custom_offset_window__plan0_optimized.sql b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Postgres/test_custom_offset_window__plan0_optimized.sql index b1d9639b54..0c9e64d6e6 100644 --- a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Postgres/test_custom_offset_window__plan0_optimized.sql +++ b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Postgres/test_custom_offset_window__plan0_optimized.sql @@ -26,12 +26,12 @@ FROM ( PARTITION BY martian_day ORDER BY ds ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) AS ds__martian_day__first_value + ) AS ds__day__first_value , LAST_VALUE(ds) OVER ( PARTITION BY martian_day ORDER BY ds ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) AS ds__martian_day__last_value + ) AS ds__day__last_value , ROW_NUMBER() OVER ( PARTITION BY martian_day ORDER BY ds @@ -42,8 +42,8 @@ FROM ( SELECT cte_6.ds__day AS ds__day , CASE - WHEN subq_24.ds__martian_day__first_value__lead + MAKE_INTERVAL(days => CAST ((cte_6.ds__day__row_number - 1) AS INTEGER)) <= subq_24.ds__martian_day__last_value__lead - THEN subq_24.ds__martian_day__first_value__lead + MAKE_INTERVAL(days => CAST ((cte_6.ds__day__row_number - 1) AS INTEGER)) + WHEN subq_24.ds__day__first_value__lead + MAKE_INTERVAL(days => CAST ((cte_6.ds__day__row_number - 1) AS INTEGER)) <= subq_24.ds__day__last_value__lead + THEN subq_24.ds__day__first_value__lead + MAKE_INTERVAL(days => CAST ((cte_6.ds__day__row_number - 1) AS INTEGER)) ELSE NULL END AS ds__day__lead FROM cte_6 cte_6 @@ -51,19 +51,19 @@ FROM ( -- Offset Custom Granularity Bounds SELECT ds__martian_day - , LEAD(ds__martian_day__first_value, 1) OVER (ORDER BY ds__martian_day) AS ds__martian_day__first_value__lead - , LEAD(ds__martian_day__last_value, 1) OVER (ORDER BY ds__martian_day) AS ds__martian_day__last_value__lead + , LEAD(ds__day__first_value, 1) OVER (ORDER BY ds__martian_day) AS ds__day__first_value__lead + , LEAD(ds__day__last_value, 1) OVER (ORDER BY ds__martian_day) AS ds__day__last_value__lead FROM ( -- Get Unique Rows for Custom Granularity Bounds SELECT ds__martian_day - , ds__martian_day__first_value - , ds__martian_day__last_value + , ds__day__first_value + , ds__day__last_value FROM cte_6 cte_6 GROUP BY ds__martian_day - , ds__martian_day__first_value - , ds__martian_day__last_value + , ds__day__first_value + , ds__day__last_value ) subq_23 ) subq_24 ON diff --git a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Postgres/test_custom_offset_window_with_granularity_and_date_part__plan0.sql b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Postgres/test_custom_offset_window_with_granularity_and_date_part__plan0.sql index 1025fa3631..f534b11318 100644 --- a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Postgres/test_custom_offset_window_with_granularity_and_date_part__plan0.sql +++ b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Postgres/test_custom_offset_window_with_granularity_and_date_part__plan0.sql @@ -151,28 +151,18 @@ FROM ( WITH cte_2 AS ( -- Get Custom Granularity Bounds SELECT - time_spine_src_28006.ds AS ds__day - , DATE_TRUNC('week', time_spine_src_28006.ds) AS ds__week - , DATE_TRUNC('month', time_spine_src_28006.ds) AS ds__month - , DATE_TRUNC('quarter', time_spine_src_28006.ds) AS ds__quarter - , DATE_TRUNC('year', time_spine_src_28006.ds) AS ds__year - , EXTRACT(year FROM time_spine_src_28006.ds) AS ds__extract_year - , EXTRACT(quarter FROM time_spine_src_28006.ds) AS ds__extract_quarter - , EXTRACT(month FROM time_spine_src_28006.ds) AS ds__extract_month - , EXTRACT(day FROM time_spine_src_28006.ds) AS ds__extract_day - , EXTRACT(isodow FROM time_spine_src_28006.ds) AS ds__extract_dow - , EXTRACT(doy FROM time_spine_src_28006.ds) AS ds__extract_doy - , time_spine_src_28006.martian_day AS ds__martian_day + subq_6.ds__day + , subq_6.ds__martian_day , FIRST_VALUE(subq_6.ds__day) OVER ( PARTITION BY subq_6.ds__martian_day ORDER BY subq_6.ds__day ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) AS ds__martian_day__first_value + ) AS ds__day__first_value , LAST_VALUE(subq_6.ds__day) OVER ( PARTITION BY subq_6.ds__martian_day ORDER BY subq_6.ds__day ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) AS ds__martian_day__last_value + ) AS ds__day__last_value , ROW_NUMBER() OVER ( PARTITION BY subq_6.ds__martian_day ORDER BY subq_6.ds__day @@ -199,8 +189,8 @@ FROM ( SELECT cte_2.ds__day AS ds__day , CASE - WHEN subq_8.ds__martian_day__first_value__lead + MAKE_INTERVAL(days => CAST ((cte_2.ds__day__row_number - 1) AS INTEGER)) <= subq_8.ds__martian_day__last_value__lead - THEN subq_8.ds__martian_day__first_value__lead + MAKE_INTERVAL(days => CAST ((cte_2.ds__day__row_number - 1) AS INTEGER)) + WHEN subq_8.ds__day__first_value__lead + MAKE_INTERVAL(days => CAST ((cte_2.ds__day__row_number - 1) AS INTEGER)) <= subq_8.ds__day__last_value__lead + THEN subq_8.ds__day__first_value__lead + MAKE_INTERVAL(days => CAST ((cte_2.ds__day__row_number - 1) AS INTEGER)) ELSE NULL END AS ds__day__lead FROM cte_2 cte_2 @@ -208,19 +198,19 @@ FROM ( -- Offset Custom Granularity Bounds SELECT subq_7.ds__martian_day - , LEAD(subq_7.ds__martian_day__first_value, 1) OVER (ORDER BY subq_7.ds__martian_day) AS ds__martian_day__first_value__lead - , LEAD(subq_7.ds__martian_day__last_value, 1) OVER (ORDER BY subq_7.ds__martian_day) AS ds__martian_day__last_value__lead + , LEAD(subq_7.ds__day__first_value, 1) OVER (ORDER BY subq_7.ds__martian_day) AS ds__day__first_value__lead + , LEAD(subq_7.ds__day__last_value, 1) OVER (ORDER BY subq_7.ds__martian_day) AS ds__day__last_value__lead FROM ( -- Get Unique Rows for Custom Granularity Bounds SELECT cte_2.ds__martian_day - , cte_2.ds__martian_day__first_value - , cte_2.ds__martian_day__last_value + , cte_2.ds__day__first_value + , cte_2.ds__day__last_value FROM cte_2 cte_2 GROUP BY cte_2.ds__martian_day - , cte_2.ds__martian_day__first_value - , cte_2.ds__martian_day__last_value + , cte_2.ds__day__first_value + , cte_2.ds__day__last_value ) subq_7 ) subq_8 ON diff --git a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Postgres/test_custom_offset_window_with_granularity_and_date_part__plan0_optimized.sql b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Postgres/test_custom_offset_window_with_granularity_and_date_part__plan0_optimized.sql index 0af3ffdf5e..42a1e31578 100644 --- a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Postgres/test_custom_offset_window_with_granularity_and_date_part__plan0_optimized.sql +++ b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Postgres/test_custom_offset_window_with_granularity_and_date_part__plan0_optimized.sql @@ -31,12 +31,12 @@ FROM ( PARTITION BY martian_day ORDER BY ds ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) AS ds__martian_day__first_value + ) AS ds__day__first_value , LAST_VALUE(ds) OVER ( PARTITION BY martian_day ORDER BY ds ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) AS ds__martian_day__last_value + ) AS ds__day__last_value , ROW_NUMBER() OVER ( PARTITION BY martian_day ORDER BY ds @@ -47,8 +47,8 @@ FROM ( SELECT cte_6.ds__day AS ds__day , CASE - WHEN subq_25.ds__martian_day__first_value__lead + MAKE_INTERVAL(days => CAST ((cte_6.ds__day__row_number - 1) AS INTEGER)) <= subq_25.ds__martian_day__last_value__lead - THEN subq_25.ds__martian_day__first_value__lead + MAKE_INTERVAL(days => CAST ((cte_6.ds__day__row_number - 1) AS INTEGER)) + WHEN subq_25.ds__day__first_value__lead + MAKE_INTERVAL(days => CAST ((cte_6.ds__day__row_number - 1) AS INTEGER)) <= subq_25.ds__day__last_value__lead + THEN subq_25.ds__day__first_value__lead + MAKE_INTERVAL(days => CAST ((cte_6.ds__day__row_number - 1) AS INTEGER)) ELSE NULL END AS ds__day__lead FROM cte_6 cte_6 @@ -56,19 +56,19 @@ FROM ( -- Offset Custom Granularity Bounds SELECT ds__martian_day - , LEAD(ds__martian_day__first_value, 1) OVER (ORDER BY ds__martian_day) AS ds__martian_day__first_value__lead - , LEAD(ds__martian_day__last_value, 1) OVER (ORDER BY ds__martian_day) AS ds__martian_day__last_value__lead + , LEAD(ds__day__first_value, 1) OVER (ORDER BY ds__martian_day) AS ds__day__first_value__lead + , LEAD(ds__day__last_value, 1) OVER (ORDER BY ds__martian_day) AS ds__day__last_value__lead FROM ( -- Get Unique Rows for Custom Granularity Bounds SELECT ds__martian_day - , ds__martian_day__first_value - , ds__martian_day__last_value + , ds__day__first_value + , ds__day__last_value FROM cte_6 cte_6 GROUP BY ds__martian_day - , ds__martian_day__first_value - , ds__martian_day__last_value + , ds__day__first_value + , ds__day__last_value ) subq_24 ) subq_25 ON diff --git a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Postgres/test_custom_offset_window_with_multiple_time_spines__plan0.sql b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Postgres/test_custom_offset_window_with_multiple_time_spines__plan0.sql new file mode 100644 index 0000000000..9389df0545 --- /dev/null +++ b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Postgres/test_custom_offset_window_with_multiple_time_spines__plan0.sql @@ -0,0 +1,703 @@ +test_name: test_custom_offset_window_with_multiple_time_spines +test_filename: test_custom_granularity.py +sql_engine: Postgres +--- +-- Compute Metrics via Expressions +SELECT + subq_17.metric_time__hour + , archived_users AS archived_users_offset_1_martian_day +FROM ( + -- Compute Metrics via Expressions + SELECT + subq_16.metric_time__hour + , subq_16.archived_users + FROM ( + -- Aggregate Measures + SELECT + subq_15.metric_time__hour + , SUM(subq_15.archived_users) AS archived_users + FROM ( + -- Pass Only Elements: ['archived_users', 'metric_time__hour'] + SELECT + subq_14.metric_time__hour + , subq_14.archived_users + FROM ( + -- Join to Time Spine Dataset + SELECT + subq_13.metric_time__hour AS metric_time__hour + , subq_6.ds__day AS ds__day + , subq_6.ds__week AS ds__week + , subq_6.ds__month AS ds__month + , subq_6.ds__quarter AS ds__quarter + , subq_6.ds__year AS ds__year + , subq_6.ds__extract_year AS ds__extract_year + , subq_6.ds__extract_quarter AS ds__extract_quarter + , subq_6.ds__extract_month AS ds__extract_month + , subq_6.ds__extract_day AS ds__extract_day + , subq_6.ds__extract_dow AS ds__extract_dow + , subq_6.ds__extract_doy AS ds__extract_doy + , subq_6.created_at__day AS created_at__day + , subq_6.created_at__week AS created_at__week + , subq_6.created_at__month AS created_at__month + , subq_6.created_at__quarter AS created_at__quarter + , subq_6.created_at__year AS created_at__year + , subq_6.created_at__extract_year AS created_at__extract_year + , subq_6.created_at__extract_quarter AS created_at__extract_quarter + , subq_6.created_at__extract_month AS created_at__extract_month + , subq_6.created_at__extract_day AS created_at__extract_day + , subq_6.created_at__extract_dow AS created_at__extract_dow + , subq_6.created_at__extract_doy AS created_at__extract_doy + , subq_6.ds_partitioned__day AS ds_partitioned__day + , subq_6.ds_partitioned__week AS ds_partitioned__week + , subq_6.ds_partitioned__month AS ds_partitioned__month + , subq_6.ds_partitioned__quarter AS ds_partitioned__quarter + , subq_6.ds_partitioned__year AS ds_partitioned__year + , subq_6.ds_partitioned__extract_year AS ds_partitioned__extract_year + , subq_6.ds_partitioned__extract_quarter AS ds_partitioned__extract_quarter + , subq_6.ds_partitioned__extract_month AS ds_partitioned__extract_month + , subq_6.ds_partitioned__extract_day AS ds_partitioned__extract_day + , subq_6.ds_partitioned__extract_dow AS ds_partitioned__extract_dow + , subq_6.ds_partitioned__extract_doy AS ds_partitioned__extract_doy + , subq_6.last_profile_edit_ts__millisecond AS last_profile_edit_ts__millisecond + , subq_6.last_profile_edit_ts__second AS last_profile_edit_ts__second + , subq_6.last_profile_edit_ts__minute AS last_profile_edit_ts__minute + , subq_6.last_profile_edit_ts__hour AS last_profile_edit_ts__hour + , subq_6.last_profile_edit_ts__day AS last_profile_edit_ts__day + , subq_6.last_profile_edit_ts__week AS last_profile_edit_ts__week + , subq_6.last_profile_edit_ts__month AS last_profile_edit_ts__month + , subq_6.last_profile_edit_ts__quarter AS last_profile_edit_ts__quarter + , subq_6.last_profile_edit_ts__year AS last_profile_edit_ts__year + , subq_6.last_profile_edit_ts__extract_year AS last_profile_edit_ts__extract_year + , subq_6.last_profile_edit_ts__extract_quarter AS last_profile_edit_ts__extract_quarter + , subq_6.last_profile_edit_ts__extract_month AS last_profile_edit_ts__extract_month + , subq_6.last_profile_edit_ts__extract_day AS last_profile_edit_ts__extract_day + , subq_6.last_profile_edit_ts__extract_dow AS last_profile_edit_ts__extract_dow + , subq_6.last_profile_edit_ts__extract_doy AS last_profile_edit_ts__extract_doy + , subq_6.bio_added_ts__second AS bio_added_ts__second + , subq_6.bio_added_ts__minute AS bio_added_ts__minute + , subq_6.bio_added_ts__hour AS bio_added_ts__hour + , subq_6.bio_added_ts__day AS bio_added_ts__day + , subq_6.bio_added_ts__week AS bio_added_ts__week + , subq_6.bio_added_ts__month AS bio_added_ts__month + , subq_6.bio_added_ts__quarter AS bio_added_ts__quarter + , subq_6.bio_added_ts__year AS bio_added_ts__year + , subq_6.bio_added_ts__extract_year AS bio_added_ts__extract_year + , subq_6.bio_added_ts__extract_quarter AS bio_added_ts__extract_quarter + , subq_6.bio_added_ts__extract_month AS bio_added_ts__extract_month + , subq_6.bio_added_ts__extract_day AS bio_added_ts__extract_day + , subq_6.bio_added_ts__extract_dow AS bio_added_ts__extract_dow + , subq_6.bio_added_ts__extract_doy AS bio_added_ts__extract_doy + , subq_6.last_login_ts__minute AS last_login_ts__minute + , subq_6.last_login_ts__hour AS last_login_ts__hour + , subq_6.last_login_ts__day AS last_login_ts__day + , subq_6.last_login_ts__week AS last_login_ts__week + , subq_6.last_login_ts__month AS last_login_ts__month + , subq_6.last_login_ts__quarter AS last_login_ts__quarter + , subq_6.last_login_ts__year AS last_login_ts__year + , subq_6.last_login_ts__extract_year AS last_login_ts__extract_year + , subq_6.last_login_ts__extract_quarter AS last_login_ts__extract_quarter + , subq_6.last_login_ts__extract_month AS last_login_ts__extract_month + , subq_6.last_login_ts__extract_day AS last_login_ts__extract_day + , subq_6.last_login_ts__extract_dow AS last_login_ts__extract_dow + , subq_6.last_login_ts__extract_doy AS last_login_ts__extract_doy + , subq_6.archived_at__hour AS archived_at__hour + , subq_6.archived_at__day AS archived_at__day + , subq_6.archived_at__week AS archived_at__week + , subq_6.archived_at__month AS archived_at__month + , subq_6.archived_at__quarter AS archived_at__quarter + , subq_6.archived_at__year AS archived_at__year + , subq_6.archived_at__extract_year AS archived_at__extract_year + , subq_6.archived_at__extract_quarter AS archived_at__extract_quarter + , subq_6.archived_at__extract_month AS archived_at__extract_month + , subq_6.archived_at__extract_day AS archived_at__extract_day + , subq_6.archived_at__extract_dow AS archived_at__extract_dow + , subq_6.archived_at__extract_doy AS archived_at__extract_doy + , subq_6.user__ds__day AS user__ds__day + , subq_6.user__ds__week AS user__ds__week + , subq_6.user__ds__month AS user__ds__month + , subq_6.user__ds__quarter AS user__ds__quarter + , subq_6.user__ds__year AS user__ds__year + , subq_6.user__ds__extract_year AS user__ds__extract_year + , subq_6.user__ds__extract_quarter AS user__ds__extract_quarter + , subq_6.user__ds__extract_month AS user__ds__extract_month + , subq_6.user__ds__extract_day AS user__ds__extract_day + , subq_6.user__ds__extract_dow AS user__ds__extract_dow + , subq_6.user__ds__extract_doy AS user__ds__extract_doy + , subq_6.user__created_at__day AS user__created_at__day + , subq_6.user__created_at__week AS user__created_at__week + , subq_6.user__created_at__month AS user__created_at__month + , subq_6.user__created_at__quarter AS user__created_at__quarter + , subq_6.user__created_at__year AS user__created_at__year + , subq_6.user__created_at__extract_year AS user__created_at__extract_year + , subq_6.user__created_at__extract_quarter AS user__created_at__extract_quarter + , subq_6.user__created_at__extract_month AS user__created_at__extract_month + , subq_6.user__created_at__extract_day AS user__created_at__extract_day + , subq_6.user__created_at__extract_dow AS user__created_at__extract_dow + , subq_6.user__created_at__extract_doy AS user__created_at__extract_doy + , subq_6.user__ds_partitioned__day AS user__ds_partitioned__day + , subq_6.user__ds_partitioned__week AS user__ds_partitioned__week + , subq_6.user__ds_partitioned__month AS user__ds_partitioned__month + , subq_6.user__ds_partitioned__quarter AS user__ds_partitioned__quarter + , subq_6.user__ds_partitioned__year AS user__ds_partitioned__year + , subq_6.user__ds_partitioned__extract_year AS user__ds_partitioned__extract_year + , subq_6.user__ds_partitioned__extract_quarter AS user__ds_partitioned__extract_quarter + , subq_6.user__ds_partitioned__extract_month AS user__ds_partitioned__extract_month + , subq_6.user__ds_partitioned__extract_day AS user__ds_partitioned__extract_day + , subq_6.user__ds_partitioned__extract_dow AS user__ds_partitioned__extract_dow + , subq_6.user__ds_partitioned__extract_doy AS user__ds_partitioned__extract_doy + , subq_6.user__last_profile_edit_ts__millisecond AS user__last_profile_edit_ts__millisecond + , subq_6.user__last_profile_edit_ts__second AS user__last_profile_edit_ts__second + , subq_6.user__last_profile_edit_ts__minute AS user__last_profile_edit_ts__minute + , subq_6.user__last_profile_edit_ts__hour AS user__last_profile_edit_ts__hour + , subq_6.user__last_profile_edit_ts__day AS user__last_profile_edit_ts__day + , subq_6.user__last_profile_edit_ts__week AS user__last_profile_edit_ts__week + , subq_6.user__last_profile_edit_ts__month AS user__last_profile_edit_ts__month + , subq_6.user__last_profile_edit_ts__quarter AS user__last_profile_edit_ts__quarter + , subq_6.user__last_profile_edit_ts__year AS user__last_profile_edit_ts__year + , subq_6.user__last_profile_edit_ts__extract_year AS user__last_profile_edit_ts__extract_year + , subq_6.user__last_profile_edit_ts__extract_quarter AS user__last_profile_edit_ts__extract_quarter + , subq_6.user__last_profile_edit_ts__extract_month AS user__last_profile_edit_ts__extract_month + , subq_6.user__last_profile_edit_ts__extract_day AS user__last_profile_edit_ts__extract_day + , subq_6.user__last_profile_edit_ts__extract_dow AS user__last_profile_edit_ts__extract_dow + , subq_6.user__last_profile_edit_ts__extract_doy AS user__last_profile_edit_ts__extract_doy + , subq_6.user__bio_added_ts__second AS user__bio_added_ts__second + , subq_6.user__bio_added_ts__minute AS user__bio_added_ts__minute + , subq_6.user__bio_added_ts__hour AS user__bio_added_ts__hour + , subq_6.user__bio_added_ts__day AS user__bio_added_ts__day + , subq_6.user__bio_added_ts__week AS user__bio_added_ts__week + , subq_6.user__bio_added_ts__month AS user__bio_added_ts__month + , subq_6.user__bio_added_ts__quarter AS user__bio_added_ts__quarter + , subq_6.user__bio_added_ts__year AS user__bio_added_ts__year + , subq_6.user__bio_added_ts__extract_year AS user__bio_added_ts__extract_year + , subq_6.user__bio_added_ts__extract_quarter AS user__bio_added_ts__extract_quarter + , subq_6.user__bio_added_ts__extract_month AS user__bio_added_ts__extract_month + , subq_6.user__bio_added_ts__extract_day AS user__bio_added_ts__extract_day + , subq_6.user__bio_added_ts__extract_dow AS user__bio_added_ts__extract_dow + , subq_6.user__bio_added_ts__extract_doy AS user__bio_added_ts__extract_doy + , subq_6.user__last_login_ts__minute AS user__last_login_ts__minute + , subq_6.user__last_login_ts__hour AS user__last_login_ts__hour + , subq_6.user__last_login_ts__day AS user__last_login_ts__day + , subq_6.user__last_login_ts__week AS user__last_login_ts__week + , subq_6.user__last_login_ts__month AS user__last_login_ts__month + , subq_6.user__last_login_ts__quarter AS user__last_login_ts__quarter + , subq_6.user__last_login_ts__year AS user__last_login_ts__year + , subq_6.user__last_login_ts__extract_year AS user__last_login_ts__extract_year + , subq_6.user__last_login_ts__extract_quarter AS user__last_login_ts__extract_quarter + , subq_6.user__last_login_ts__extract_month AS user__last_login_ts__extract_month + , subq_6.user__last_login_ts__extract_day AS user__last_login_ts__extract_day + , subq_6.user__last_login_ts__extract_dow AS user__last_login_ts__extract_dow + , subq_6.user__last_login_ts__extract_doy AS user__last_login_ts__extract_doy + , subq_6.user__archived_at__hour AS user__archived_at__hour + , subq_6.user__archived_at__day AS user__archived_at__day + , subq_6.user__archived_at__week AS user__archived_at__week + , subq_6.user__archived_at__month AS user__archived_at__month + , subq_6.user__archived_at__quarter AS user__archived_at__quarter + , subq_6.user__archived_at__year AS user__archived_at__year + , subq_6.user__archived_at__extract_year AS user__archived_at__extract_year + , subq_6.user__archived_at__extract_quarter AS user__archived_at__extract_quarter + , subq_6.user__archived_at__extract_month AS user__archived_at__extract_month + , subq_6.user__archived_at__extract_day AS user__archived_at__extract_day + , subq_6.user__archived_at__extract_dow AS user__archived_at__extract_dow + , subq_6.user__archived_at__extract_doy AS user__archived_at__extract_doy + , subq_6.metric_time__day AS metric_time__day + , subq_6.metric_time__week AS metric_time__week + , subq_6.metric_time__month AS metric_time__month + , subq_6.metric_time__quarter AS metric_time__quarter + , subq_6.metric_time__year AS metric_time__year + , subq_6.metric_time__extract_year AS metric_time__extract_year + , subq_6.metric_time__extract_quarter AS metric_time__extract_quarter + , subq_6.metric_time__extract_month AS metric_time__extract_month + , subq_6.metric_time__extract_day AS metric_time__extract_day + , subq_6.metric_time__extract_dow AS metric_time__extract_dow + , subq_6.metric_time__extract_doy AS metric_time__extract_doy + , subq_6.user AS user + , subq_6.home_state AS home_state + , subq_6.user__home_state AS user__home_state + , subq_6.archived_users AS archived_users + FROM ( + -- Pass Only Elements: ['ts__hour', 'metric_time__hour'] + SELECT + subq_12.ts__hour + , subq_12.metric_time__hour + FROM ( + -- Apply Requested Granularities + SELECT + subq_11.ts__hour + , subq_11.ts__hour__lead AS metric_time__hour + FROM ( + -- Offset Base Granularity By Custom Granularity Period(s) + WITH cte_2 AS ( + -- Get Custom Granularity Bounds + SELECT + subq_8.ts__hour AS ts__hour + , subq_7.ds__martian_day AS ds__martian_day + , FIRST_VALUE(subq_8.ts__hour) OVER ( + PARTITION BY subq_7.ds__martian_day + ORDER BY subq_8.ts__hour + ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING + ) AS ts__hour__first_value + , LAST_VALUE(subq_8.ts__hour) OVER ( + PARTITION BY subq_7.ds__martian_day + ORDER BY subq_8.ts__hour + ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING + ) AS ts__hour__last_value + , ROW_NUMBER() OVER ( + PARTITION BY subq_7.ds__martian_day + ORDER BY subq_8.ts__hour + ) AS ts__hour__row_number + FROM ( + -- Read From Time Spine 'mf_time_spine' + SELECT + time_spine_src_28006.ds AS ds__day + , DATE_TRUNC('week', time_spine_src_28006.ds) AS ds__week + , DATE_TRUNC('month', time_spine_src_28006.ds) AS ds__month + , DATE_TRUNC('quarter', time_spine_src_28006.ds) AS ds__quarter + , DATE_TRUNC('year', time_spine_src_28006.ds) AS ds__year + , EXTRACT(year FROM time_spine_src_28006.ds) AS ds__extract_year + , EXTRACT(quarter FROM time_spine_src_28006.ds) AS ds__extract_quarter + , EXTRACT(month FROM time_spine_src_28006.ds) AS ds__extract_month + , EXTRACT(day FROM time_spine_src_28006.ds) AS ds__extract_day + , EXTRACT(isodow FROM time_spine_src_28006.ds) AS ds__extract_dow + , EXTRACT(doy FROM time_spine_src_28006.ds) AS ds__extract_doy + , time_spine_src_28006.martian_day AS ds__martian_day + FROM ***************************.mf_time_spine time_spine_src_28006 + ) subq_7 + INNER JOIN ( + -- Read From Time Spine 'mf_time_spine_hour' + SELECT + time_spine_src_28005.ts AS ts__hour + , DATE_TRUNC('day', time_spine_src_28005.ts) AS ts__day + , DATE_TRUNC('week', time_spine_src_28005.ts) AS ts__week + , DATE_TRUNC('month', time_spine_src_28005.ts) AS ts__month + , DATE_TRUNC('quarter', time_spine_src_28005.ts) AS ts__quarter + , DATE_TRUNC('year', time_spine_src_28005.ts) AS ts__year + , EXTRACT(year FROM time_spine_src_28005.ts) AS ts__extract_year + , EXTRACT(quarter FROM time_spine_src_28005.ts) AS ts__extract_quarter + , EXTRACT(month FROM time_spine_src_28005.ts) AS ts__extract_month + , EXTRACT(day FROM time_spine_src_28005.ts) AS ts__extract_day + , EXTRACT(isodow FROM time_spine_src_28005.ts) AS ts__extract_dow + , EXTRACT(doy FROM time_spine_src_28005.ts) AS ts__extract_doy + FROM ***************************.mf_time_spine_hour time_spine_src_28005 + ) subq_8 + ON + subq_7.ds__day = subq_8.ts__day + ) + + SELECT + cte_2.ts__hour AS ts__hour + , CASE + WHEN subq_10.ts__hour__first_value__lead + MAKE_INTERVAL(hours => CAST ((cte_2.ts__hour__row_number - 1) AS INTEGER)) <= subq_10.ts__hour__last_value__lead + THEN subq_10.ts__hour__first_value__lead + MAKE_INTERVAL(hours => CAST ((cte_2.ts__hour__row_number - 1) AS INTEGER)) + ELSE NULL + END AS ts__hour__lead + FROM cte_2 cte_2 + INNER JOIN ( + -- Offset Custom Granularity Bounds + SELECT + subq_9.ds__martian_day + , LEAD(subq_9.ts__hour__first_value, 1) OVER (ORDER BY subq_9.ds__martian_day) AS ts__hour__first_value__lead + , LEAD(subq_9.ts__hour__last_value, 1) OVER (ORDER BY subq_9.ds__martian_day) AS ts__hour__last_value__lead + FROM ( + -- Get Unique Rows for Custom Granularity Bounds + SELECT + cte_2.ds__martian_day + , cte_2.ts__hour__first_value + , cte_2.ts__hour__last_value + FROM cte_2 cte_2 + GROUP BY + cte_2.ds__martian_day + , cte_2.ts__hour__first_value + , cte_2.ts__hour__last_value + ) subq_9 + ) subq_10 + ON + cte_2.ds__martian_day = subq_10.ds__martian_day + ) subq_11 + ) subq_12 + ) subq_13 + INNER JOIN ( + -- Metric Time Dimension 'archived_at' + SELECT + subq_5.ds__day + , subq_5.ds__week + , subq_5.ds__month + , subq_5.ds__quarter + , subq_5.ds__year + , subq_5.ds__extract_year + , subq_5.ds__extract_quarter + , subq_5.ds__extract_month + , subq_5.ds__extract_day + , subq_5.ds__extract_dow + , subq_5.ds__extract_doy + , subq_5.created_at__day + , subq_5.created_at__week + , subq_5.created_at__month + , subq_5.created_at__quarter + , subq_5.created_at__year + , subq_5.created_at__extract_year + , subq_5.created_at__extract_quarter + , subq_5.created_at__extract_month + , subq_5.created_at__extract_day + , subq_5.created_at__extract_dow + , subq_5.created_at__extract_doy + , subq_5.ds_partitioned__day + , subq_5.ds_partitioned__week + , subq_5.ds_partitioned__month + , subq_5.ds_partitioned__quarter + , subq_5.ds_partitioned__year + , subq_5.ds_partitioned__extract_year + , subq_5.ds_partitioned__extract_quarter + , subq_5.ds_partitioned__extract_month + , subq_5.ds_partitioned__extract_day + , subq_5.ds_partitioned__extract_dow + , subq_5.ds_partitioned__extract_doy + , subq_5.last_profile_edit_ts__millisecond + , subq_5.last_profile_edit_ts__second + , subq_5.last_profile_edit_ts__minute + , subq_5.last_profile_edit_ts__hour + , subq_5.last_profile_edit_ts__day + , subq_5.last_profile_edit_ts__week + , subq_5.last_profile_edit_ts__month + , subq_5.last_profile_edit_ts__quarter + , subq_5.last_profile_edit_ts__year + , subq_5.last_profile_edit_ts__extract_year + , subq_5.last_profile_edit_ts__extract_quarter + , subq_5.last_profile_edit_ts__extract_month + , subq_5.last_profile_edit_ts__extract_day + , subq_5.last_profile_edit_ts__extract_dow + , subq_5.last_profile_edit_ts__extract_doy + , subq_5.bio_added_ts__second + , subq_5.bio_added_ts__minute + , subq_5.bio_added_ts__hour + , subq_5.bio_added_ts__day + , subq_5.bio_added_ts__week + , subq_5.bio_added_ts__month + , subq_5.bio_added_ts__quarter + , subq_5.bio_added_ts__year + , subq_5.bio_added_ts__extract_year + , subq_5.bio_added_ts__extract_quarter + , subq_5.bio_added_ts__extract_month + , subq_5.bio_added_ts__extract_day + , subq_5.bio_added_ts__extract_dow + , subq_5.bio_added_ts__extract_doy + , subq_5.last_login_ts__minute + , subq_5.last_login_ts__hour + , subq_5.last_login_ts__day + , subq_5.last_login_ts__week + , subq_5.last_login_ts__month + , subq_5.last_login_ts__quarter + , subq_5.last_login_ts__year + , subq_5.last_login_ts__extract_year + , subq_5.last_login_ts__extract_quarter + , subq_5.last_login_ts__extract_month + , subq_5.last_login_ts__extract_day + , subq_5.last_login_ts__extract_dow + , subq_5.last_login_ts__extract_doy + , subq_5.archived_at__hour + , subq_5.archived_at__day + , subq_5.archived_at__week + , subq_5.archived_at__month + , subq_5.archived_at__quarter + , subq_5.archived_at__year + , subq_5.archived_at__extract_year + , subq_5.archived_at__extract_quarter + , subq_5.archived_at__extract_month + , subq_5.archived_at__extract_day + , subq_5.archived_at__extract_dow + , subq_5.archived_at__extract_doy + , subq_5.user__ds__day + , subq_5.user__ds__week + , subq_5.user__ds__month + , subq_5.user__ds__quarter + , subq_5.user__ds__year + , subq_5.user__ds__extract_year + , subq_5.user__ds__extract_quarter + , subq_5.user__ds__extract_month + , subq_5.user__ds__extract_day + , subq_5.user__ds__extract_dow + , subq_5.user__ds__extract_doy + , subq_5.user__created_at__day + , subq_5.user__created_at__week + , subq_5.user__created_at__month + , subq_5.user__created_at__quarter + , subq_5.user__created_at__year + , subq_5.user__created_at__extract_year + , subq_5.user__created_at__extract_quarter + , subq_5.user__created_at__extract_month + , subq_5.user__created_at__extract_day + , subq_5.user__created_at__extract_dow + , subq_5.user__created_at__extract_doy + , subq_5.user__ds_partitioned__day + , subq_5.user__ds_partitioned__week + , subq_5.user__ds_partitioned__month + , subq_5.user__ds_partitioned__quarter + , subq_5.user__ds_partitioned__year + , subq_5.user__ds_partitioned__extract_year + , subq_5.user__ds_partitioned__extract_quarter + , subq_5.user__ds_partitioned__extract_month + , subq_5.user__ds_partitioned__extract_day + , subq_5.user__ds_partitioned__extract_dow + , subq_5.user__ds_partitioned__extract_doy + , subq_5.user__last_profile_edit_ts__millisecond + , subq_5.user__last_profile_edit_ts__second + , subq_5.user__last_profile_edit_ts__minute + , subq_5.user__last_profile_edit_ts__hour + , subq_5.user__last_profile_edit_ts__day + , subq_5.user__last_profile_edit_ts__week + , subq_5.user__last_profile_edit_ts__month + , subq_5.user__last_profile_edit_ts__quarter + , subq_5.user__last_profile_edit_ts__year + , subq_5.user__last_profile_edit_ts__extract_year + , subq_5.user__last_profile_edit_ts__extract_quarter + , subq_5.user__last_profile_edit_ts__extract_month + , subq_5.user__last_profile_edit_ts__extract_day + , subq_5.user__last_profile_edit_ts__extract_dow + , subq_5.user__last_profile_edit_ts__extract_doy + , subq_5.user__bio_added_ts__second + , subq_5.user__bio_added_ts__minute + , subq_5.user__bio_added_ts__hour + , subq_5.user__bio_added_ts__day + , subq_5.user__bio_added_ts__week + , subq_5.user__bio_added_ts__month + , subq_5.user__bio_added_ts__quarter + , subq_5.user__bio_added_ts__year + , subq_5.user__bio_added_ts__extract_year + , subq_5.user__bio_added_ts__extract_quarter + , subq_5.user__bio_added_ts__extract_month + , subq_5.user__bio_added_ts__extract_day + , subq_5.user__bio_added_ts__extract_dow + , subq_5.user__bio_added_ts__extract_doy + , subq_5.user__last_login_ts__minute + , subq_5.user__last_login_ts__hour + , subq_5.user__last_login_ts__day + , subq_5.user__last_login_ts__week + , subq_5.user__last_login_ts__month + , subq_5.user__last_login_ts__quarter + , subq_5.user__last_login_ts__year + , subq_5.user__last_login_ts__extract_year + , subq_5.user__last_login_ts__extract_quarter + , subq_5.user__last_login_ts__extract_month + , subq_5.user__last_login_ts__extract_day + , subq_5.user__last_login_ts__extract_dow + , subq_5.user__last_login_ts__extract_doy + , subq_5.user__archived_at__hour + , subq_5.user__archived_at__day + , subq_5.user__archived_at__week + , subq_5.user__archived_at__month + , subq_5.user__archived_at__quarter + , subq_5.user__archived_at__year + , subq_5.user__archived_at__extract_year + , subq_5.user__archived_at__extract_quarter + , subq_5.user__archived_at__extract_month + , subq_5.user__archived_at__extract_day + , subq_5.user__archived_at__extract_dow + , subq_5.user__archived_at__extract_doy + , subq_5.archived_at__hour AS metric_time__hour + , subq_5.archived_at__day AS metric_time__day + , subq_5.archived_at__week AS metric_time__week + , subq_5.archived_at__month AS metric_time__month + , subq_5.archived_at__quarter AS metric_time__quarter + , subq_5.archived_at__year AS metric_time__year + , subq_5.archived_at__extract_year AS metric_time__extract_year + , subq_5.archived_at__extract_quarter AS metric_time__extract_quarter + , subq_5.archived_at__extract_month AS metric_time__extract_month + , subq_5.archived_at__extract_day AS metric_time__extract_day + , subq_5.archived_at__extract_dow AS metric_time__extract_dow + , subq_5.archived_at__extract_doy AS metric_time__extract_doy + , subq_5.user + , subq_5.home_state + , subq_5.user__home_state + , subq_5.archived_users + FROM ( + -- Read Elements From Semantic Model 'users_ds_source' + SELECT + 1 AS new_users + , 1 AS archived_users + , DATE_TRUNC('day', users_ds_source_src_28000.ds) AS ds__day + , DATE_TRUNC('week', users_ds_source_src_28000.ds) AS ds__week + , DATE_TRUNC('month', users_ds_source_src_28000.ds) AS ds__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.ds) AS ds__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.ds) AS ds__year + , EXTRACT(year FROM users_ds_source_src_28000.ds) AS ds__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.ds) AS ds__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.ds) AS ds__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.ds) AS ds__extract_day + , EXTRACT(isodow FROM users_ds_source_src_28000.ds) AS ds__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.ds) AS ds__extract_doy + , DATE_TRUNC('day', users_ds_source_src_28000.created_at) AS created_at__day + , DATE_TRUNC('week', users_ds_source_src_28000.created_at) AS created_at__week + , DATE_TRUNC('month', users_ds_source_src_28000.created_at) AS created_at__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.created_at) AS created_at__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.created_at) AS created_at__year + , EXTRACT(year FROM users_ds_source_src_28000.created_at) AS created_at__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.created_at) AS created_at__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.created_at) AS created_at__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.created_at) AS created_at__extract_day + , EXTRACT(isodow FROM users_ds_source_src_28000.created_at) AS created_at__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.created_at) AS created_at__extract_doy + , DATE_TRUNC('day', users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__day + , DATE_TRUNC('week', users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__week + , DATE_TRUNC('month', users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__year + , EXTRACT(year FROM users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__extract_day + , EXTRACT(isodow FROM users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__extract_doy + , users_ds_source_src_28000.home_state + , DATE_TRUNC('millisecond', users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__millisecond + , DATE_TRUNC('second', users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__second + , DATE_TRUNC('minute', users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__minute + , DATE_TRUNC('hour', users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__hour + , DATE_TRUNC('day', users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__day + , DATE_TRUNC('week', users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__week + , DATE_TRUNC('month', users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__year + , EXTRACT(year FROM users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__extract_day + , EXTRACT(isodow FROM users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__extract_doy + , DATE_TRUNC('second', users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__second + , DATE_TRUNC('minute', users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__minute + , DATE_TRUNC('hour', users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__hour + , DATE_TRUNC('day', users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__day + , DATE_TRUNC('week', users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__week + , DATE_TRUNC('month', users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__year + , EXTRACT(year FROM users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__extract_day + , EXTRACT(isodow FROM users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__extract_doy + , DATE_TRUNC('minute', users_ds_source_src_28000.last_login_ts) AS last_login_ts__minute + , DATE_TRUNC('hour', users_ds_source_src_28000.last_login_ts) AS last_login_ts__hour + , DATE_TRUNC('day', users_ds_source_src_28000.last_login_ts) AS last_login_ts__day + , DATE_TRUNC('week', users_ds_source_src_28000.last_login_ts) AS last_login_ts__week + , DATE_TRUNC('month', users_ds_source_src_28000.last_login_ts) AS last_login_ts__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.last_login_ts) AS last_login_ts__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.last_login_ts) AS last_login_ts__year + , EXTRACT(year FROM users_ds_source_src_28000.last_login_ts) AS last_login_ts__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.last_login_ts) AS last_login_ts__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.last_login_ts) AS last_login_ts__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.last_login_ts) AS last_login_ts__extract_day + , EXTRACT(isodow FROM users_ds_source_src_28000.last_login_ts) AS last_login_ts__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.last_login_ts) AS last_login_ts__extract_doy + , DATE_TRUNC('hour', users_ds_source_src_28000.archived_at) AS archived_at__hour + , DATE_TRUNC('day', users_ds_source_src_28000.archived_at) AS archived_at__day + , DATE_TRUNC('week', users_ds_source_src_28000.archived_at) AS archived_at__week + , DATE_TRUNC('month', users_ds_source_src_28000.archived_at) AS archived_at__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.archived_at) AS archived_at__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.archived_at) AS archived_at__year + , EXTRACT(year FROM users_ds_source_src_28000.archived_at) AS archived_at__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.archived_at) AS archived_at__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.archived_at) AS archived_at__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.archived_at) AS archived_at__extract_day + , EXTRACT(isodow FROM users_ds_source_src_28000.archived_at) AS archived_at__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.archived_at) AS archived_at__extract_doy + , DATE_TRUNC('day', users_ds_source_src_28000.ds) AS user__ds__day + , DATE_TRUNC('week', users_ds_source_src_28000.ds) AS user__ds__week + , DATE_TRUNC('month', users_ds_source_src_28000.ds) AS user__ds__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.ds) AS user__ds__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.ds) AS user__ds__year + , EXTRACT(year FROM users_ds_source_src_28000.ds) AS user__ds__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.ds) AS user__ds__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.ds) AS user__ds__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.ds) AS user__ds__extract_day + , EXTRACT(isodow FROM users_ds_source_src_28000.ds) AS user__ds__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.ds) AS user__ds__extract_doy + , DATE_TRUNC('day', users_ds_source_src_28000.created_at) AS user__created_at__day + , DATE_TRUNC('week', users_ds_source_src_28000.created_at) AS user__created_at__week + , DATE_TRUNC('month', users_ds_source_src_28000.created_at) AS user__created_at__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.created_at) AS user__created_at__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.created_at) AS user__created_at__year + , EXTRACT(year FROM users_ds_source_src_28000.created_at) AS user__created_at__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.created_at) AS user__created_at__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.created_at) AS user__created_at__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.created_at) AS user__created_at__extract_day + , EXTRACT(isodow FROM users_ds_source_src_28000.created_at) AS user__created_at__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.created_at) AS user__created_at__extract_doy + , DATE_TRUNC('day', users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__day + , DATE_TRUNC('week', users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__week + , DATE_TRUNC('month', users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__year + , EXTRACT(year FROM users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__extract_day + , EXTRACT(isodow FROM users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__extract_doy + , users_ds_source_src_28000.home_state AS user__home_state + , DATE_TRUNC('millisecond', users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__millisecond + , DATE_TRUNC('second', users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__second + , DATE_TRUNC('minute', users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__minute + , DATE_TRUNC('hour', users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__hour + , DATE_TRUNC('day', users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__day + , DATE_TRUNC('week', users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__week + , DATE_TRUNC('month', users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__year + , EXTRACT(year FROM users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__extract_day + , EXTRACT(isodow FROM users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__extract_doy + , DATE_TRUNC('second', users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__second + , DATE_TRUNC('minute', users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__minute + , DATE_TRUNC('hour', users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__hour + , DATE_TRUNC('day', users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__day + , DATE_TRUNC('week', users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__week + , DATE_TRUNC('month', users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__year + , EXTRACT(year FROM users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__extract_day + , EXTRACT(isodow FROM users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__extract_doy + , DATE_TRUNC('minute', users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__minute + , DATE_TRUNC('hour', users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__hour + , DATE_TRUNC('day', users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__day + , DATE_TRUNC('week', users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__week + , DATE_TRUNC('month', users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__year + , EXTRACT(year FROM users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__extract_day + , EXTRACT(isodow FROM users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__extract_doy + , DATE_TRUNC('hour', users_ds_source_src_28000.archived_at) AS user__archived_at__hour + , DATE_TRUNC('day', users_ds_source_src_28000.archived_at) AS user__archived_at__day + , DATE_TRUNC('week', users_ds_source_src_28000.archived_at) AS user__archived_at__week + , DATE_TRUNC('month', users_ds_source_src_28000.archived_at) AS user__archived_at__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.archived_at) AS user__archived_at__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.archived_at) AS user__archived_at__year + , EXTRACT(year FROM users_ds_source_src_28000.archived_at) AS user__archived_at__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.archived_at) AS user__archived_at__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.archived_at) AS user__archived_at__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.archived_at) AS user__archived_at__extract_day + , EXTRACT(isodow FROM users_ds_source_src_28000.archived_at) AS user__archived_at__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.archived_at) AS user__archived_at__extract_doy + , users_ds_source_src_28000.user_id AS user + FROM ***************************.dim_users users_ds_source_src_28000 + ) subq_5 + ) subq_6 + ON + subq_13.ts__hour = subq_6.metric_time__hour + ) subq_14 + ) subq_15 + GROUP BY + subq_15.metric_time__hour + ) subq_16 +) subq_17 diff --git a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Postgres/test_custom_offset_window_with_multiple_time_spines__plan0_optimized.sql b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Postgres/test_custom_offset_window_with_multiple_time_spines__plan0_optimized.sql new file mode 100644 index 0000000000..ecc323705b --- /dev/null +++ b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Postgres/test_custom_offset_window_with_multiple_time_spines__plan0_optimized.sql @@ -0,0 +1,87 @@ +test_name: test_custom_offset_window_with_multiple_time_spines +test_filename: test_custom_granularity.py +sql_engine: Postgres +--- +-- Compute Metrics via Expressions +SELECT + metric_time__hour + , archived_users AS archived_users_offset_1_martian_day +FROM ( + -- Join to Time Spine Dataset + -- Pass Only Elements: ['archived_users', 'metric_time__hour'] + -- Aggregate Measures + -- Compute Metrics via Expressions + SELECT + subq_29.ts__hour__lead AS metric_time__hour + , SUM(subq_24.archived_users) AS archived_users + FROM ( + -- Offset Base Granularity By Custom Granularity Period(s) + WITH cte_6 AS ( + -- Get Custom Granularity Bounds + SELECT + time_spine_src_28005.ts AS ts__hour + , time_spine_src_28006.martian_day AS ds__martian_day + , FIRST_VALUE(time_spine_src_28005.ts) OVER ( + PARTITION BY time_spine_src_28006.martian_day + ORDER BY time_spine_src_28005.ts + ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING + ) AS ts__hour__first_value + , LAST_VALUE(time_spine_src_28005.ts) OVER ( + PARTITION BY time_spine_src_28006.martian_day + ORDER BY time_spine_src_28005.ts + ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING + ) AS ts__hour__last_value + , ROW_NUMBER() OVER ( + PARTITION BY time_spine_src_28006.martian_day + ORDER BY time_spine_src_28005.ts + ) AS ts__hour__row_number + FROM ***************************.mf_time_spine time_spine_src_28006 + INNER JOIN + ***************************.mf_time_spine_hour time_spine_src_28005 + ON + time_spine_src_28006.ds = DATE_TRUNC('day', time_spine_src_28005.ts) + ) + + SELECT + cte_6.ts__hour AS ts__hour + , CASE + WHEN subq_28.ts__hour__first_value__lead + MAKE_INTERVAL(hours => CAST ((cte_6.ts__hour__row_number - 1) AS INTEGER)) <= subq_28.ts__hour__last_value__lead + THEN subq_28.ts__hour__first_value__lead + MAKE_INTERVAL(hours => CAST ((cte_6.ts__hour__row_number - 1) AS INTEGER)) + ELSE NULL + END AS ts__hour__lead + FROM cte_6 cte_6 + INNER JOIN ( + -- Offset Custom Granularity Bounds + SELECT + ds__martian_day + , LEAD(ts__hour__first_value, 1) OVER (ORDER BY ds__martian_day) AS ts__hour__first_value__lead + , LEAD(ts__hour__last_value, 1) OVER (ORDER BY ds__martian_day) AS ts__hour__last_value__lead + FROM ( + -- Get Unique Rows for Custom Granularity Bounds + SELECT + ds__martian_day + , ts__hour__first_value + , ts__hour__last_value + FROM cte_6 cte_6 + GROUP BY + ds__martian_day + , ts__hour__first_value + , ts__hour__last_value + ) subq_27 + ) subq_28 + ON + cte_6.ds__martian_day = subq_28.ds__martian_day + ) subq_29 + INNER JOIN ( + -- Read Elements From Semantic Model 'users_ds_source' + -- Metric Time Dimension 'archived_at' + SELECT + DATE_TRUNC('hour', archived_at) AS metric_time__hour + , 1 AS archived_users + FROM ***************************.dim_users users_ds_source_src_28000 + ) subq_24 + ON + subq_29.ts__hour = subq_24.metric_time__hour + GROUP BY + subq_29.ts__hour__lead +) subq_35 diff --git a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Redshift/test_custom_offset_window__plan0.sql b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Redshift/test_custom_offset_window__plan0.sql index 99b7f4b87f..ff0394387f 100644 --- a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Redshift/test_custom_offset_window__plan0.sql +++ b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Redshift/test_custom_offset_window__plan0.sql @@ -137,28 +137,18 @@ FROM ( WITH cte_2 AS ( -- Get Custom Granularity Bounds SELECT - time_spine_src_28006.ds AS ds__day - , DATE_TRUNC('week', time_spine_src_28006.ds) AS ds__week - , DATE_TRUNC('month', time_spine_src_28006.ds) AS ds__month - , DATE_TRUNC('quarter', time_spine_src_28006.ds) AS ds__quarter - , DATE_TRUNC('year', time_spine_src_28006.ds) AS ds__year - , EXTRACT(year FROM time_spine_src_28006.ds) AS ds__extract_year - , EXTRACT(quarter FROM time_spine_src_28006.ds) AS ds__extract_quarter - , EXTRACT(month FROM time_spine_src_28006.ds) AS ds__extract_month - , EXTRACT(day FROM time_spine_src_28006.ds) AS ds__extract_day - , CASE WHEN EXTRACT(dow FROM time_spine_src_28006.ds) = 0 THEN EXTRACT(dow FROM time_spine_src_28006.ds) + 7 ELSE EXTRACT(dow FROM time_spine_src_28006.ds) END AS ds__extract_dow - , EXTRACT(doy FROM time_spine_src_28006.ds) AS ds__extract_doy - , time_spine_src_28006.martian_day AS ds__martian_day + subq_6.ds__day + , subq_6.ds__martian_day , FIRST_VALUE(subq_6.ds__day) OVER ( PARTITION BY subq_6.ds__martian_day ORDER BY subq_6.ds__day ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) AS ds__martian_day__first_value + ) AS ds__day__first_value , LAST_VALUE(subq_6.ds__day) OVER ( PARTITION BY subq_6.ds__martian_day ORDER BY subq_6.ds__day ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) AS ds__martian_day__last_value + ) AS ds__day__last_value , ROW_NUMBER() OVER ( PARTITION BY subq_6.ds__martian_day ORDER BY subq_6.ds__day @@ -185,8 +175,8 @@ FROM ( SELECT cte_2.ds__day AS ds__day , CASE - WHEN DATEADD(day, (cte_2.ds__day__row_number - 1), subq_8.ds__martian_day__first_value__lead) <= subq_8.ds__martian_day__last_value__lead - THEN DATEADD(day, (cte_2.ds__day__row_number - 1), subq_8.ds__martian_day__first_value__lead) + WHEN DATEADD(day, (cte_2.ds__day__row_number - 1), subq_8.ds__day__first_value__lead) <= subq_8.ds__day__last_value__lead + THEN DATEADD(day, (cte_2.ds__day__row_number - 1), subq_8.ds__day__first_value__lead) ELSE NULL END AS ds__day__lead FROM cte_2 cte_2 @@ -194,19 +184,19 @@ FROM ( -- Offset Custom Granularity Bounds SELECT subq_7.ds__martian_day - , LEAD(subq_7.ds__martian_day__first_value, 1) OVER (ORDER BY subq_7.ds__martian_day) AS ds__martian_day__first_value__lead - , LEAD(subq_7.ds__martian_day__last_value, 1) OVER (ORDER BY subq_7.ds__martian_day) AS ds__martian_day__last_value__lead + , LEAD(subq_7.ds__day__first_value, 1) OVER (ORDER BY subq_7.ds__martian_day) AS ds__day__first_value__lead + , LEAD(subq_7.ds__day__last_value, 1) OVER (ORDER BY subq_7.ds__martian_day) AS ds__day__last_value__lead FROM ( -- Get Unique Rows for Custom Granularity Bounds SELECT cte_2.ds__martian_day - , cte_2.ds__martian_day__first_value - , cte_2.ds__martian_day__last_value + , cte_2.ds__day__first_value + , cte_2.ds__day__last_value FROM cte_2 cte_2 GROUP BY cte_2.ds__martian_day - , cte_2.ds__martian_day__first_value - , cte_2.ds__martian_day__last_value + , cte_2.ds__day__first_value + , cte_2.ds__day__last_value ) subq_7 ) subq_8 ON diff --git a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Redshift/test_custom_offset_window__plan0_optimized.sql b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Redshift/test_custom_offset_window__plan0_optimized.sql index d66fcd87f0..6e818372aa 100644 --- a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Redshift/test_custom_offset_window__plan0_optimized.sql +++ b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Redshift/test_custom_offset_window__plan0_optimized.sql @@ -26,12 +26,12 @@ FROM ( PARTITION BY martian_day ORDER BY ds ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) AS ds__martian_day__first_value + ) AS ds__day__first_value , LAST_VALUE(ds) OVER ( PARTITION BY martian_day ORDER BY ds ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) AS ds__martian_day__last_value + ) AS ds__day__last_value , ROW_NUMBER() OVER ( PARTITION BY martian_day ORDER BY ds @@ -42,8 +42,8 @@ FROM ( SELECT cte_6.ds__day AS ds__day , CASE - WHEN DATEADD(day, (cte_6.ds__day__row_number - 1), subq_24.ds__martian_day__first_value__lead) <= subq_24.ds__martian_day__last_value__lead - THEN DATEADD(day, (cte_6.ds__day__row_number - 1), subq_24.ds__martian_day__first_value__lead) + WHEN DATEADD(day, (cte_6.ds__day__row_number - 1), subq_24.ds__day__first_value__lead) <= subq_24.ds__day__last_value__lead + THEN DATEADD(day, (cte_6.ds__day__row_number - 1), subq_24.ds__day__first_value__lead) ELSE NULL END AS ds__day__lead FROM cte_6 cte_6 @@ -51,19 +51,19 @@ FROM ( -- Offset Custom Granularity Bounds SELECT ds__martian_day - , LEAD(ds__martian_day__first_value, 1) OVER (ORDER BY ds__martian_day) AS ds__martian_day__first_value__lead - , LEAD(ds__martian_day__last_value, 1) OVER (ORDER BY ds__martian_day) AS ds__martian_day__last_value__lead + , LEAD(ds__day__first_value, 1) OVER (ORDER BY ds__martian_day) AS ds__day__first_value__lead + , LEAD(ds__day__last_value, 1) OVER (ORDER BY ds__martian_day) AS ds__day__last_value__lead FROM ( -- Get Unique Rows for Custom Granularity Bounds SELECT ds__martian_day - , ds__martian_day__first_value - , ds__martian_day__last_value + , ds__day__first_value + , ds__day__last_value FROM cte_6 cte_6 GROUP BY ds__martian_day - , ds__martian_day__first_value - , ds__martian_day__last_value + , ds__day__first_value + , ds__day__last_value ) subq_23 ) subq_24 ON diff --git a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Redshift/test_custom_offset_window_with_granularity_and_date_part__plan0.sql b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Redshift/test_custom_offset_window_with_granularity_and_date_part__plan0.sql index 4893469313..d4f3000a9a 100644 --- a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Redshift/test_custom_offset_window_with_granularity_and_date_part__plan0.sql +++ b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Redshift/test_custom_offset_window_with_granularity_and_date_part__plan0.sql @@ -151,28 +151,18 @@ FROM ( WITH cte_2 AS ( -- Get Custom Granularity Bounds SELECT - time_spine_src_28006.ds AS ds__day - , DATE_TRUNC('week', time_spine_src_28006.ds) AS ds__week - , DATE_TRUNC('month', time_spine_src_28006.ds) AS ds__month - , DATE_TRUNC('quarter', time_spine_src_28006.ds) AS ds__quarter - , DATE_TRUNC('year', time_spine_src_28006.ds) AS ds__year - , EXTRACT(year FROM time_spine_src_28006.ds) AS ds__extract_year - , EXTRACT(quarter FROM time_spine_src_28006.ds) AS ds__extract_quarter - , EXTRACT(month FROM time_spine_src_28006.ds) AS ds__extract_month - , EXTRACT(day FROM time_spine_src_28006.ds) AS ds__extract_day - , CASE WHEN EXTRACT(dow FROM time_spine_src_28006.ds) = 0 THEN EXTRACT(dow FROM time_spine_src_28006.ds) + 7 ELSE EXTRACT(dow FROM time_spine_src_28006.ds) END AS ds__extract_dow - , EXTRACT(doy FROM time_spine_src_28006.ds) AS ds__extract_doy - , time_spine_src_28006.martian_day AS ds__martian_day + subq_6.ds__day + , subq_6.ds__martian_day , FIRST_VALUE(subq_6.ds__day) OVER ( PARTITION BY subq_6.ds__martian_day ORDER BY subq_6.ds__day ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) AS ds__martian_day__first_value + ) AS ds__day__first_value , LAST_VALUE(subq_6.ds__day) OVER ( PARTITION BY subq_6.ds__martian_day ORDER BY subq_6.ds__day ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) AS ds__martian_day__last_value + ) AS ds__day__last_value , ROW_NUMBER() OVER ( PARTITION BY subq_6.ds__martian_day ORDER BY subq_6.ds__day @@ -199,8 +189,8 @@ FROM ( SELECT cte_2.ds__day AS ds__day , CASE - WHEN DATEADD(day, (cte_2.ds__day__row_number - 1), subq_8.ds__martian_day__first_value__lead) <= subq_8.ds__martian_day__last_value__lead - THEN DATEADD(day, (cte_2.ds__day__row_number - 1), subq_8.ds__martian_day__first_value__lead) + WHEN DATEADD(day, (cte_2.ds__day__row_number - 1), subq_8.ds__day__first_value__lead) <= subq_8.ds__day__last_value__lead + THEN DATEADD(day, (cte_2.ds__day__row_number - 1), subq_8.ds__day__first_value__lead) ELSE NULL END AS ds__day__lead FROM cte_2 cte_2 @@ -208,19 +198,19 @@ FROM ( -- Offset Custom Granularity Bounds SELECT subq_7.ds__martian_day - , LEAD(subq_7.ds__martian_day__first_value, 1) OVER (ORDER BY subq_7.ds__martian_day) AS ds__martian_day__first_value__lead - , LEAD(subq_7.ds__martian_day__last_value, 1) OVER (ORDER BY subq_7.ds__martian_day) AS ds__martian_day__last_value__lead + , LEAD(subq_7.ds__day__first_value, 1) OVER (ORDER BY subq_7.ds__martian_day) AS ds__day__first_value__lead + , LEAD(subq_7.ds__day__last_value, 1) OVER (ORDER BY subq_7.ds__martian_day) AS ds__day__last_value__lead FROM ( -- Get Unique Rows for Custom Granularity Bounds SELECT cte_2.ds__martian_day - , cte_2.ds__martian_day__first_value - , cte_2.ds__martian_day__last_value + , cte_2.ds__day__first_value + , cte_2.ds__day__last_value FROM cte_2 cte_2 GROUP BY cte_2.ds__martian_day - , cte_2.ds__martian_day__first_value - , cte_2.ds__martian_day__last_value + , cte_2.ds__day__first_value + , cte_2.ds__day__last_value ) subq_7 ) subq_8 ON diff --git a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Redshift/test_custom_offset_window_with_granularity_and_date_part__plan0_optimized.sql b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Redshift/test_custom_offset_window_with_granularity_and_date_part__plan0_optimized.sql index a91344fb20..4fd946b40f 100644 --- a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Redshift/test_custom_offset_window_with_granularity_and_date_part__plan0_optimized.sql +++ b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Redshift/test_custom_offset_window_with_granularity_and_date_part__plan0_optimized.sql @@ -31,12 +31,12 @@ FROM ( PARTITION BY martian_day ORDER BY ds ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) AS ds__martian_day__first_value + ) AS ds__day__first_value , LAST_VALUE(ds) OVER ( PARTITION BY martian_day ORDER BY ds ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) AS ds__martian_day__last_value + ) AS ds__day__last_value , ROW_NUMBER() OVER ( PARTITION BY martian_day ORDER BY ds @@ -47,8 +47,8 @@ FROM ( SELECT cte_6.ds__day AS ds__day , CASE - WHEN DATEADD(day, (cte_6.ds__day__row_number - 1), subq_25.ds__martian_day__first_value__lead) <= subq_25.ds__martian_day__last_value__lead - THEN DATEADD(day, (cte_6.ds__day__row_number - 1), subq_25.ds__martian_day__first_value__lead) + WHEN DATEADD(day, (cte_6.ds__day__row_number - 1), subq_25.ds__day__first_value__lead) <= subq_25.ds__day__last_value__lead + THEN DATEADD(day, (cte_6.ds__day__row_number - 1), subq_25.ds__day__first_value__lead) ELSE NULL END AS ds__day__lead FROM cte_6 cte_6 @@ -56,19 +56,19 @@ FROM ( -- Offset Custom Granularity Bounds SELECT ds__martian_day - , LEAD(ds__martian_day__first_value, 1) OVER (ORDER BY ds__martian_day) AS ds__martian_day__first_value__lead - , LEAD(ds__martian_day__last_value, 1) OVER (ORDER BY ds__martian_day) AS ds__martian_day__last_value__lead + , LEAD(ds__day__first_value, 1) OVER (ORDER BY ds__martian_day) AS ds__day__first_value__lead + , LEAD(ds__day__last_value, 1) OVER (ORDER BY ds__martian_day) AS ds__day__last_value__lead FROM ( -- Get Unique Rows for Custom Granularity Bounds SELECT ds__martian_day - , ds__martian_day__first_value - , ds__martian_day__last_value + , ds__day__first_value + , ds__day__last_value FROM cte_6 cte_6 GROUP BY ds__martian_day - , ds__martian_day__first_value - , ds__martian_day__last_value + , ds__day__first_value + , ds__day__last_value ) subq_24 ) subq_25 ON diff --git a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Redshift/test_custom_offset_window_with_multiple_time_spines__plan0.sql b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Redshift/test_custom_offset_window_with_multiple_time_spines__plan0.sql new file mode 100644 index 0000000000..c01120d7cd --- /dev/null +++ b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Redshift/test_custom_offset_window_with_multiple_time_spines__plan0.sql @@ -0,0 +1,703 @@ +test_name: test_custom_offset_window_with_multiple_time_spines +test_filename: test_custom_granularity.py +sql_engine: Redshift +--- +-- Compute Metrics via Expressions +SELECT + subq_17.metric_time__hour + , archived_users AS archived_users_offset_1_martian_day +FROM ( + -- Compute Metrics via Expressions + SELECT + subq_16.metric_time__hour + , subq_16.archived_users + FROM ( + -- Aggregate Measures + SELECT + subq_15.metric_time__hour + , SUM(subq_15.archived_users) AS archived_users + FROM ( + -- Pass Only Elements: ['archived_users', 'metric_time__hour'] + SELECT + subq_14.metric_time__hour + , subq_14.archived_users + FROM ( + -- Join to Time Spine Dataset + SELECT + subq_13.metric_time__hour AS metric_time__hour + , subq_6.ds__day AS ds__day + , subq_6.ds__week AS ds__week + , subq_6.ds__month AS ds__month + , subq_6.ds__quarter AS ds__quarter + , subq_6.ds__year AS ds__year + , subq_6.ds__extract_year AS ds__extract_year + , subq_6.ds__extract_quarter AS ds__extract_quarter + , subq_6.ds__extract_month AS ds__extract_month + , subq_6.ds__extract_day AS ds__extract_day + , subq_6.ds__extract_dow AS ds__extract_dow + , subq_6.ds__extract_doy AS ds__extract_doy + , subq_6.created_at__day AS created_at__day + , subq_6.created_at__week AS created_at__week + , subq_6.created_at__month AS created_at__month + , subq_6.created_at__quarter AS created_at__quarter + , subq_6.created_at__year AS created_at__year + , subq_6.created_at__extract_year AS created_at__extract_year + , subq_6.created_at__extract_quarter AS created_at__extract_quarter + , subq_6.created_at__extract_month AS created_at__extract_month + , subq_6.created_at__extract_day AS created_at__extract_day + , subq_6.created_at__extract_dow AS created_at__extract_dow + , subq_6.created_at__extract_doy AS created_at__extract_doy + , subq_6.ds_partitioned__day AS ds_partitioned__day + , subq_6.ds_partitioned__week AS ds_partitioned__week + , subq_6.ds_partitioned__month AS ds_partitioned__month + , subq_6.ds_partitioned__quarter AS ds_partitioned__quarter + , subq_6.ds_partitioned__year AS ds_partitioned__year + , subq_6.ds_partitioned__extract_year AS ds_partitioned__extract_year + , subq_6.ds_partitioned__extract_quarter AS ds_partitioned__extract_quarter + , subq_6.ds_partitioned__extract_month AS ds_partitioned__extract_month + , subq_6.ds_partitioned__extract_day AS ds_partitioned__extract_day + , subq_6.ds_partitioned__extract_dow AS ds_partitioned__extract_dow + , subq_6.ds_partitioned__extract_doy AS ds_partitioned__extract_doy + , subq_6.last_profile_edit_ts__millisecond AS last_profile_edit_ts__millisecond + , subq_6.last_profile_edit_ts__second AS last_profile_edit_ts__second + , subq_6.last_profile_edit_ts__minute AS last_profile_edit_ts__minute + , subq_6.last_profile_edit_ts__hour AS last_profile_edit_ts__hour + , subq_6.last_profile_edit_ts__day AS last_profile_edit_ts__day + , subq_6.last_profile_edit_ts__week AS last_profile_edit_ts__week + , subq_6.last_profile_edit_ts__month AS last_profile_edit_ts__month + , subq_6.last_profile_edit_ts__quarter AS last_profile_edit_ts__quarter + , subq_6.last_profile_edit_ts__year AS last_profile_edit_ts__year + , subq_6.last_profile_edit_ts__extract_year AS last_profile_edit_ts__extract_year + , subq_6.last_profile_edit_ts__extract_quarter AS last_profile_edit_ts__extract_quarter + , subq_6.last_profile_edit_ts__extract_month AS last_profile_edit_ts__extract_month + , subq_6.last_profile_edit_ts__extract_day AS last_profile_edit_ts__extract_day + , subq_6.last_profile_edit_ts__extract_dow AS last_profile_edit_ts__extract_dow + , subq_6.last_profile_edit_ts__extract_doy AS last_profile_edit_ts__extract_doy + , subq_6.bio_added_ts__second AS bio_added_ts__second + , subq_6.bio_added_ts__minute AS bio_added_ts__minute + , subq_6.bio_added_ts__hour AS bio_added_ts__hour + , subq_6.bio_added_ts__day AS bio_added_ts__day + , subq_6.bio_added_ts__week AS bio_added_ts__week + , subq_6.bio_added_ts__month AS bio_added_ts__month + , subq_6.bio_added_ts__quarter AS bio_added_ts__quarter + , subq_6.bio_added_ts__year AS bio_added_ts__year + , subq_6.bio_added_ts__extract_year AS bio_added_ts__extract_year + , subq_6.bio_added_ts__extract_quarter AS bio_added_ts__extract_quarter + , subq_6.bio_added_ts__extract_month AS bio_added_ts__extract_month + , subq_6.bio_added_ts__extract_day AS bio_added_ts__extract_day + , subq_6.bio_added_ts__extract_dow AS bio_added_ts__extract_dow + , subq_6.bio_added_ts__extract_doy AS bio_added_ts__extract_doy + , subq_6.last_login_ts__minute AS last_login_ts__minute + , subq_6.last_login_ts__hour AS last_login_ts__hour + , subq_6.last_login_ts__day AS last_login_ts__day + , subq_6.last_login_ts__week AS last_login_ts__week + , subq_6.last_login_ts__month AS last_login_ts__month + , subq_6.last_login_ts__quarter AS last_login_ts__quarter + , subq_6.last_login_ts__year AS last_login_ts__year + , subq_6.last_login_ts__extract_year AS last_login_ts__extract_year + , subq_6.last_login_ts__extract_quarter AS last_login_ts__extract_quarter + , subq_6.last_login_ts__extract_month AS last_login_ts__extract_month + , subq_6.last_login_ts__extract_day AS last_login_ts__extract_day + , subq_6.last_login_ts__extract_dow AS last_login_ts__extract_dow + , subq_6.last_login_ts__extract_doy AS last_login_ts__extract_doy + , subq_6.archived_at__hour AS archived_at__hour + , subq_6.archived_at__day AS archived_at__day + , subq_6.archived_at__week AS archived_at__week + , subq_6.archived_at__month AS archived_at__month + , subq_6.archived_at__quarter AS archived_at__quarter + , subq_6.archived_at__year AS archived_at__year + , subq_6.archived_at__extract_year AS archived_at__extract_year + , subq_6.archived_at__extract_quarter AS archived_at__extract_quarter + , subq_6.archived_at__extract_month AS archived_at__extract_month + , subq_6.archived_at__extract_day AS archived_at__extract_day + , subq_6.archived_at__extract_dow AS archived_at__extract_dow + , subq_6.archived_at__extract_doy AS archived_at__extract_doy + , subq_6.user__ds__day AS user__ds__day + , subq_6.user__ds__week AS user__ds__week + , subq_6.user__ds__month AS user__ds__month + , subq_6.user__ds__quarter AS user__ds__quarter + , subq_6.user__ds__year AS user__ds__year + , subq_6.user__ds__extract_year AS user__ds__extract_year + , subq_6.user__ds__extract_quarter AS user__ds__extract_quarter + , subq_6.user__ds__extract_month AS user__ds__extract_month + , subq_6.user__ds__extract_day AS user__ds__extract_day + , subq_6.user__ds__extract_dow AS user__ds__extract_dow + , subq_6.user__ds__extract_doy AS user__ds__extract_doy + , subq_6.user__created_at__day AS user__created_at__day + , subq_6.user__created_at__week AS user__created_at__week + , subq_6.user__created_at__month AS user__created_at__month + , subq_6.user__created_at__quarter AS user__created_at__quarter + , subq_6.user__created_at__year AS user__created_at__year + , subq_6.user__created_at__extract_year AS user__created_at__extract_year + , subq_6.user__created_at__extract_quarter AS user__created_at__extract_quarter + , subq_6.user__created_at__extract_month AS user__created_at__extract_month + , subq_6.user__created_at__extract_day AS user__created_at__extract_day + , subq_6.user__created_at__extract_dow AS user__created_at__extract_dow + , subq_6.user__created_at__extract_doy AS user__created_at__extract_doy + , subq_6.user__ds_partitioned__day AS user__ds_partitioned__day + , subq_6.user__ds_partitioned__week AS user__ds_partitioned__week + , subq_6.user__ds_partitioned__month AS user__ds_partitioned__month + , subq_6.user__ds_partitioned__quarter AS user__ds_partitioned__quarter + , subq_6.user__ds_partitioned__year AS user__ds_partitioned__year + , subq_6.user__ds_partitioned__extract_year AS user__ds_partitioned__extract_year + , subq_6.user__ds_partitioned__extract_quarter AS user__ds_partitioned__extract_quarter + , subq_6.user__ds_partitioned__extract_month AS user__ds_partitioned__extract_month + , subq_6.user__ds_partitioned__extract_day AS user__ds_partitioned__extract_day + , subq_6.user__ds_partitioned__extract_dow AS user__ds_partitioned__extract_dow + , subq_6.user__ds_partitioned__extract_doy AS user__ds_partitioned__extract_doy + , subq_6.user__last_profile_edit_ts__millisecond AS user__last_profile_edit_ts__millisecond + , subq_6.user__last_profile_edit_ts__second AS user__last_profile_edit_ts__second + , subq_6.user__last_profile_edit_ts__minute AS user__last_profile_edit_ts__minute + , subq_6.user__last_profile_edit_ts__hour AS user__last_profile_edit_ts__hour + , subq_6.user__last_profile_edit_ts__day AS user__last_profile_edit_ts__day + , subq_6.user__last_profile_edit_ts__week AS user__last_profile_edit_ts__week + , subq_6.user__last_profile_edit_ts__month AS user__last_profile_edit_ts__month + , subq_6.user__last_profile_edit_ts__quarter AS user__last_profile_edit_ts__quarter + , subq_6.user__last_profile_edit_ts__year AS user__last_profile_edit_ts__year + , subq_6.user__last_profile_edit_ts__extract_year AS user__last_profile_edit_ts__extract_year + , subq_6.user__last_profile_edit_ts__extract_quarter AS user__last_profile_edit_ts__extract_quarter + , subq_6.user__last_profile_edit_ts__extract_month AS user__last_profile_edit_ts__extract_month + , subq_6.user__last_profile_edit_ts__extract_day AS user__last_profile_edit_ts__extract_day + , subq_6.user__last_profile_edit_ts__extract_dow AS user__last_profile_edit_ts__extract_dow + , subq_6.user__last_profile_edit_ts__extract_doy AS user__last_profile_edit_ts__extract_doy + , subq_6.user__bio_added_ts__second AS user__bio_added_ts__second + , subq_6.user__bio_added_ts__minute AS user__bio_added_ts__minute + , subq_6.user__bio_added_ts__hour AS user__bio_added_ts__hour + , subq_6.user__bio_added_ts__day AS user__bio_added_ts__day + , subq_6.user__bio_added_ts__week AS user__bio_added_ts__week + , subq_6.user__bio_added_ts__month AS user__bio_added_ts__month + , subq_6.user__bio_added_ts__quarter AS user__bio_added_ts__quarter + , subq_6.user__bio_added_ts__year AS user__bio_added_ts__year + , subq_6.user__bio_added_ts__extract_year AS user__bio_added_ts__extract_year + , subq_6.user__bio_added_ts__extract_quarter AS user__bio_added_ts__extract_quarter + , subq_6.user__bio_added_ts__extract_month AS user__bio_added_ts__extract_month + , subq_6.user__bio_added_ts__extract_day AS user__bio_added_ts__extract_day + , subq_6.user__bio_added_ts__extract_dow AS user__bio_added_ts__extract_dow + , subq_6.user__bio_added_ts__extract_doy AS user__bio_added_ts__extract_doy + , subq_6.user__last_login_ts__minute AS user__last_login_ts__minute + , subq_6.user__last_login_ts__hour AS user__last_login_ts__hour + , subq_6.user__last_login_ts__day AS user__last_login_ts__day + , subq_6.user__last_login_ts__week AS user__last_login_ts__week + , subq_6.user__last_login_ts__month AS user__last_login_ts__month + , subq_6.user__last_login_ts__quarter AS user__last_login_ts__quarter + , subq_6.user__last_login_ts__year AS user__last_login_ts__year + , subq_6.user__last_login_ts__extract_year AS user__last_login_ts__extract_year + , subq_6.user__last_login_ts__extract_quarter AS user__last_login_ts__extract_quarter + , subq_6.user__last_login_ts__extract_month AS user__last_login_ts__extract_month + , subq_6.user__last_login_ts__extract_day AS user__last_login_ts__extract_day + , subq_6.user__last_login_ts__extract_dow AS user__last_login_ts__extract_dow + , subq_6.user__last_login_ts__extract_doy AS user__last_login_ts__extract_doy + , subq_6.user__archived_at__hour AS user__archived_at__hour + , subq_6.user__archived_at__day AS user__archived_at__day + , subq_6.user__archived_at__week AS user__archived_at__week + , subq_6.user__archived_at__month AS user__archived_at__month + , subq_6.user__archived_at__quarter AS user__archived_at__quarter + , subq_6.user__archived_at__year AS user__archived_at__year + , subq_6.user__archived_at__extract_year AS user__archived_at__extract_year + , subq_6.user__archived_at__extract_quarter AS user__archived_at__extract_quarter + , subq_6.user__archived_at__extract_month AS user__archived_at__extract_month + , subq_6.user__archived_at__extract_day AS user__archived_at__extract_day + , subq_6.user__archived_at__extract_dow AS user__archived_at__extract_dow + , subq_6.user__archived_at__extract_doy AS user__archived_at__extract_doy + , subq_6.metric_time__day AS metric_time__day + , subq_6.metric_time__week AS metric_time__week + , subq_6.metric_time__month AS metric_time__month + , subq_6.metric_time__quarter AS metric_time__quarter + , subq_6.metric_time__year AS metric_time__year + , subq_6.metric_time__extract_year AS metric_time__extract_year + , subq_6.metric_time__extract_quarter AS metric_time__extract_quarter + , subq_6.metric_time__extract_month AS metric_time__extract_month + , subq_6.metric_time__extract_day AS metric_time__extract_day + , subq_6.metric_time__extract_dow AS metric_time__extract_dow + , subq_6.metric_time__extract_doy AS metric_time__extract_doy + , subq_6.user AS user + , subq_6.home_state AS home_state + , subq_6.user__home_state AS user__home_state + , subq_6.archived_users AS archived_users + FROM ( + -- Pass Only Elements: ['ts__hour', 'metric_time__hour'] + SELECT + subq_12.ts__hour + , subq_12.metric_time__hour + FROM ( + -- Apply Requested Granularities + SELECT + subq_11.ts__hour + , subq_11.ts__hour__lead AS metric_time__hour + FROM ( + -- Offset Base Granularity By Custom Granularity Period(s) + WITH cte_2 AS ( + -- Get Custom Granularity Bounds + SELECT + subq_8.ts__hour AS ts__hour + , subq_7.ds__martian_day AS ds__martian_day + , FIRST_VALUE(subq_8.ts__hour) OVER ( + PARTITION BY subq_7.ds__martian_day + ORDER BY subq_8.ts__hour + ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING + ) AS ts__hour__first_value + , LAST_VALUE(subq_8.ts__hour) OVER ( + PARTITION BY subq_7.ds__martian_day + ORDER BY subq_8.ts__hour + ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING + ) AS ts__hour__last_value + , ROW_NUMBER() OVER ( + PARTITION BY subq_7.ds__martian_day + ORDER BY subq_8.ts__hour + ) AS ts__hour__row_number + FROM ( + -- Read From Time Spine 'mf_time_spine' + SELECT + time_spine_src_28006.ds AS ds__day + , DATE_TRUNC('week', time_spine_src_28006.ds) AS ds__week + , DATE_TRUNC('month', time_spine_src_28006.ds) AS ds__month + , DATE_TRUNC('quarter', time_spine_src_28006.ds) AS ds__quarter + , DATE_TRUNC('year', time_spine_src_28006.ds) AS ds__year + , EXTRACT(year FROM time_spine_src_28006.ds) AS ds__extract_year + , EXTRACT(quarter FROM time_spine_src_28006.ds) AS ds__extract_quarter + , EXTRACT(month FROM time_spine_src_28006.ds) AS ds__extract_month + , EXTRACT(day FROM time_spine_src_28006.ds) AS ds__extract_day + , CASE WHEN EXTRACT(dow FROM time_spine_src_28006.ds) = 0 THEN EXTRACT(dow FROM time_spine_src_28006.ds) + 7 ELSE EXTRACT(dow FROM time_spine_src_28006.ds) END AS ds__extract_dow + , EXTRACT(doy FROM time_spine_src_28006.ds) AS ds__extract_doy + , time_spine_src_28006.martian_day AS ds__martian_day + FROM ***************************.mf_time_spine time_spine_src_28006 + ) subq_7 + INNER JOIN ( + -- Read From Time Spine 'mf_time_spine_hour' + SELECT + time_spine_src_28005.ts AS ts__hour + , DATE_TRUNC('day', time_spine_src_28005.ts) AS ts__day + , DATE_TRUNC('week', time_spine_src_28005.ts) AS ts__week + , DATE_TRUNC('month', time_spine_src_28005.ts) AS ts__month + , DATE_TRUNC('quarter', time_spine_src_28005.ts) AS ts__quarter + , DATE_TRUNC('year', time_spine_src_28005.ts) AS ts__year + , EXTRACT(year FROM time_spine_src_28005.ts) AS ts__extract_year + , EXTRACT(quarter FROM time_spine_src_28005.ts) AS ts__extract_quarter + , EXTRACT(month FROM time_spine_src_28005.ts) AS ts__extract_month + , EXTRACT(day FROM time_spine_src_28005.ts) AS ts__extract_day + , CASE WHEN EXTRACT(dow FROM time_spine_src_28005.ts) = 0 THEN EXTRACT(dow FROM time_spine_src_28005.ts) + 7 ELSE EXTRACT(dow FROM time_spine_src_28005.ts) END AS ts__extract_dow + , EXTRACT(doy FROM time_spine_src_28005.ts) AS ts__extract_doy + FROM ***************************.mf_time_spine_hour time_spine_src_28005 + ) subq_8 + ON + subq_7.ds__day = subq_8.ts__day + ) + + SELECT + cte_2.ts__hour AS ts__hour + , CASE + WHEN DATEADD(hour, (cte_2.ts__hour__row_number - 1), subq_10.ts__hour__first_value__lead) <= subq_10.ts__hour__last_value__lead + THEN DATEADD(hour, (cte_2.ts__hour__row_number - 1), subq_10.ts__hour__first_value__lead) + ELSE NULL + END AS ts__hour__lead + FROM cte_2 cte_2 + INNER JOIN ( + -- Offset Custom Granularity Bounds + SELECT + subq_9.ds__martian_day + , LEAD(subq_9.ts__hour__first_value, 1) OVER (ORDER BY subq_9.ds__martian_day) AS ts__hour__first_value__lead + , LEAD(subq_9.ts__hour__last_value, 1) OVER (ORDER BY subq_9.ds__martian_day) AS ts__hour__last_value__lead + FROM ( + -- Get Unique Rows for Custom Granularity Bounds + SELECT + cte_2.ds__martian_day + , cte_2.ts__hour__first_value + , cte_2.ts__hour__last_value + FROM cte_2 cte_2 + GROUP BY + cte_2.ds__martian_day + , cte_2.ts__hour__first_value + , cte_2.ts__hour__last_value + ) subq_9 + ) subq_10 + ON + cte_2.ds__martian_day = subq_10.ds__martian_day + ) subq_11 + ) subq_12 + ) subq_13 + INNER JOIN ( + -- Metric Time Dimension 'archived_at' + SELECT + subq_5.ds__day + , subq_5.ds__week + , subq_5.ds__month + , subq_5.ds__quarter + , subq_5.ds__year + , subq_5.ds__extract_year + , subq_5.ds__extract_quarter + , subq_5.ds__extract_month + , subq_5.ds__extract_day + , subq_5.ds__extract_dow + , subq_5.ds__extract_doy + , subq_5.created_at__day + , subq_5.created_at__week + , subq_5.created_at__month + , subq_5.created_at__quarter + , subq_5.created_at__year + , subq_5.created_at__extract_year + , subq_5.created_at__extract_quarter + , subq_5.created_at__extract_month + , subq_5.created_at__extract_day + , subq_5.created_at__extract_dow + , subq_5.created_at__extract_doy + , subq_5.ds_partitioned__day + , subq_5.ds_partitioned__week + , subq_5.ds_partitioned__month + , subq_5.ds_partitioned__quarter + , subq_5.ds_partitioned__year + , subq_5.ds_partitioned__extract_year + , subq_5.ds_partitioned__extract_quarter + , subq_5.ds_partitioned__extract_month + , subq_5.ds_partitioned__extract_day + , subq_5.ds_partitioned__extract_dow + , subq_5.ds_partitioned__extract_doy + , subq_5.last_profile_edit_ts__millisecond + , subq_5.last_profile_edit_ts__second + , subq_5.last_profile_edit_ts__minute + , subq_5.last_profile_edit_ts__hour + , subq_5.last_profile_edit_ts__day + , subq_5.last_profile_edit_ts__week + , subq_5.last_profile_edit_ts__month + , subq_5.last_profile_edit_ts__quarter + , subq_5.last_profile_edit_ts__year + , subq_5.last_profile_edit_ts__extract_year + , subq_5.last_profile_edit_ts__extract_quarter + , subq_5.last_profile_edit_ts__extract_month + , subq_5.last_profile_edit_ts__extract_day + , subq_5.last_profile_edit_ts__extract_dow + , subq_5.last_profile_edit_ts__extract_doy + , subq_5.bio_added_ts__second + , subq_5.bio_added_ts__minute + , subq_5.bio_added_ts__hour + , subq_5.bio_added_ts__day + , subq_5.bio_added_ts__week + , subq_5.bio_added_ts__month + , subq_5.bio_added_ts__quarter + , subq_5.bio_added_ts__year + , subq_5.bio_added_ts__extract_year + , subq_5.bio_added_ts__extract_quarter + , subq_5.bio_added_ts__extract_month + , subq_5.bio_added_ts__extract_day + , subq_5.bio_added_ts__extract_dow + , subq_5.bio_added_ts__extract_doy + , subq_5.last_login_ts__minute + , subq_5.last_login_ts__hour + , subq_5.last_login_ts__day + , subq_5.last_login_ts__week + , subq_5.last_login_ts__month + , subq_5.last_login_ts__quarter + , subq_5.last_login_ts__year + , subq_5.last_login_ts__extract_year + , subq_5.last_login_ts__extract_quarter + , subq_5.last_login_ts__extract_month + , subq_5.last_login_ts__extract_day + , subq_5.last_login_ts__extract_dow + , subq_5.last_login_ts__extract_doy + , subq_5.archived_at__hour + , subq_5.archived_at__day + , subq_5.archived_at__week + , subq_5.archived_at__month + , subq_5.archived_at__quarter + , subq_5.archived_at__year + , subq_5.archived_at__extract_year + , subq_5.archived_at__extract_quarter + , subq_5.archived_at__extract_month + , subq_5.archived_at__extract_day + , subq_5.archived_at__extract_dow + , subq_5.archived_at__extract_doy + , subq_5.user__ds__day + , subq_5.user__ds__week + , subq_5.user__ds__month + , subq_5.user__ds__quarter + , subq_5.user__ds__year + , subq_5.user__ds__extract_year + , subq_5.user__ds__extract_quarter + , subq_5.user__ds__extract_month + , subq_5.user__ds__extract_day + , subq_5.user__ds__extract_dow + , subq_5.user__ds__extract_doy + , subq_5.user__created_at__day + , subq_5.user__created_at__week + , subq_5.user__created_at__month + , subq_5.user__created_at__quarter + , subq_5.user__created_at__year + , subq_5.user__created_at__extract_year + , subq_5.user__created_at__extract_quarter + , subq_5.user__created_at__extract_month + , subq_5.user__created_at__extract_day + , subq_5.user__created_at__extract_dow + , subq_5.user__created_at__extract_doy + , subq_5.user__ds_partitioned__day + , subq_5.user__ds_partitioned__week + , subq_5.user__ds_partitioned__month + , subq_5.user__ds_partitioned__quarter + , subq_5.user__ds_partitioned__year + , subq_5.user__ds_partitioned__extract_year + , subq_5.user__ds_partitioned__extract_quarter + , subq_5.user__ds_partitioned__extract_month + , subq_5.user__ds_partitioned__extract_day + , subq_5.user__ds_partitioned__extract_dow + , subq_5.user__ds_partitioned__extract_doy + , subq_5.user__last_profile_edit_ts__millisecond + , subq_5.user__last_profile_edit_ts__second + , subq_5.user__last_profile_edit_ts__minute + , subq_5.user__last_profile_edit_ts__hour + , subq_5.user__last_profile_edit_ts__day + , subq_5.user__last_profile_edit_ts__week + , subq_5.user__last_profile_edit_ts__month + , subq_5.user__last_profile_edit_ts__quarter + , subq_5.user__last_profile_edit_ts__year + , subq_5.user__last_profile_edit_ts__extract_year + , subq_5.user__last_profile_edit_ts__extract_quarter + , subq_5.user__last_profile_edit_ts__extract_month + , subq_5.user__last_profile_edit_ts__extract_day + , subq_5.user__last_profile_edit_ts__extract_dow + , subq_5.user__last_profile_edit_ts__extract_doy + , subq_5.user__bio_added_ts__second + , subq_5.user__bio_added_ts__minute + , subq_5.user__bio_added_ts__hour + , subq_5.user__bio_added_ts__day + , subq_5.user__bio_added_ts__week + , subq_5.user__bio_added_ts__month + , subq_5.user__bio_added_ts__quarter + , subq_5.user__bio_added_ts__year + , subq_5.user__bio_added_ts__extract_year + , subq_5.user__bio_added_ts__extract_quarter + , subq_5.user__bio_added_ts__extract_month + , subq_5.user__bio_added_ts__extract_day + , subq_5.user__bio_added_ts__extract_dow + , subq_5.user__bio_added_ts__extract_doy + , subq_5.user__last_login_ts__minute + , subq_5.user__last_login_ts__hour + , subq_5.user__last_login_ts__day + , subq_5.user__last_login_ts__week + , subq_5.user__last_login_ts__month + , subq_5.user__last_login_ts__quarter + , subq_5.user__last_login_ts__year + , subq_5.user__last_login_ts__extract_year + , subq_5.user__last_login_ts__extract_quarter + , subq_5.user__last_login_ts__extract_month + , subq_5.user__last_login_ts__extract_day + , subq_5.user__last_login_ts__extract_dow + , subq_5.user__last_login_ts__extract_doy + , subq_5.user__archived_at__hour + , subq_5.user__archived_at__day + , subq_5.user__archived_at__week + , subq_5.user__archived_at__month + , subq_5.user__archived_at__quarter + , subq_5.user__archived_at__year + , subq_5.user__archived_at__extract_year + , subq_5.user__archived_at__extract_quarter + , subq_5.user__archived_at__extract_month + , subq_5.user__archived_at__extract_day + , subq_5.user__archived_at__extract_dow + , subq_5.user__archived_at__extract_doy + , subq_5.archived_at__hour AS metric_time__hour + , subq_5.archived_at__day AS metric_time__day + , subq_5.archived_at__week AS metric_time__week + , subq_5.archived_at__month AS metric_time__month + , subq_5.archived_at__quarter AS metric_time__quarter + , subq_5.archived_at__year AS metric_time__year + , subq_5.archived_at__extract_year AS metric_time__extract_year + , subq_5.archived_at__extract_quarter AS metric_time__extract_quarter + , subq_5.archived_at__extract_month AS metric_time__extract_month + , subq_5.archived_at__extract_day AS metric_time__extract_day + , subq_5.archived_at__extract_dow AS metric_time__extract_dow + , subq_5.archived_at__extract_doy AS metric_time__extract_doy + , subq_5.user + , subq_5.home_state + , subq_5.user__home_state + , subq_5.archived_users + FROM ( + -- Read Elements From Semantic Model 'users_ds_source' + SELECT + 1 AS new_users + , 1 AS archived_users + , DATE_TRUNC('day', users_ds_source_src_28000.ds) AS ds__day + , DATE_TRUNC('week', users_ds_source_src_28000.ds) AS ds__week + , DATE_TRUNC('month', users_ds_source_src_28000.ds) AS ds__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.ds) AS ds__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.ds) AS ds__year + , EXTRACT(year FROM users_ds_source_src_28000.ds) AS ds__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.ds) AS ds__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.ds) AS ds__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.ds) AS ds__extract_day + , CASE WHEN EXTRACT(dow FROM users_ds_source_src_28000.ds) = 0 THEN EXTRACT(dow FROM users_ds_source_src_28000.ds) + 7 ELSE EXTRACT(dow FROM users_ds_source_src_28000.ds) END AS ds__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.ds) AS ds__extract_doy + , DATE_TRUNC('day', users_ds_source_src_28000.created_at) AS created_at__day + , DATE_TRUNC('week', users_ds_source_src_28000.created_at) AS created_at__week + , DATE_TRUNC('month', users_ds_source_src_28000.created_at) AS created_at__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.created_at) AS created_at__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.created_at) AS created_at__year + , EXTRACT(year FROM users_ds_source_src_28000.created_at) AS created_at__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.created_at) AS created_at__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.created_at) AS created_at__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.created_at) AS created_at__extract_day + , CASE WHEN EXTRACT(dow FROM users_ds_source_src_28000.created_at) = 0 THEN EXTRACT(dow FROM users_ds_source_src_28000.created_at) + 7 ELSE EXTRACT(dow FROM users_ds_source_src_28000.created_at) END AS created_at__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.created_at) AS created_at__extract_doy + , DATE_TRUNC('day', users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__day + , DATE_TRUNC('week', users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__week + , DATE_TRUNC('month', users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__year + , EXTRACT(year FROM users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__extract_day + , CASE WHEN EXTRACT(dow FROM users_ds_source_src_28000.ds_partitioned) = 0 THEN EXTRACT(dow FROM users_ds_source_src_28000.ds_partitioned) + 7 ELSE EXTRACT(dow FROM users_ds_source_src_28000.ds_partitioned) END AS ds_partitioned__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__extract_doy + , users_ds_source_src_28000.home_state + , DATE_TRUNC('millisecond', users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__millisecond + , DATE_TRUNC('second', users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__second + , DATE_TRUNC('minute', users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__minute + , DATE_TRUNC('hour', users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__hour + , DATE_TRUNC('day', users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__day + , DATE_TRUNC('week', users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__week + , DATE_TRUNC('month', users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__year + , EXTRACT(year FROM users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__extract_day + , CASE WHEN EXTRACT(dow FROM users_ds_source_src_28000.last_profile_edit_ts) = 0 THEN EXTRACT(dow FROM users_ds_source_src_28000.last_profile_edit_ts) + 7 ELSE EXTRACT(dow FROM users_ds_source_src_28000.last_profile_edit_ts) END AS last_profile_edit_ts__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__extract_doy + , DATE_TRUNC('second', users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__second + , DATE_TRUNC('minute', users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__minute + , DATE_TRUNC('hour', users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__hour + , DATE_TRUNC('day', users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__day + , DATE_TRUNC('week', users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__week + , DATE_TRUNC('month', users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__year + , EXTRACT(year FROM users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__extract_day + , CASE WHEN EXTRACT(dow FROM users_ds_source_src_28000.bio_added_ts) = 0 THEN EXTRACT(dow FROM users_ds_source_src_28000.bio_added_ts) + 7 ELSE EXTRACT(dow FROM users_ds_source_src_28000.bio_added_ts) END AS bio_added_ts__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__extract_doy + , DATE_TRUNC('minute', users_ds_source_src_28000.last_login_ts) AS last_login_ts__minute + , DATE_TRUNC('hour', users_ds_source_src_28000.last_login_ts) AS last_login_ts__hour + , DATE_TRUNC('day', users_ds_source_src_28000.last_login_ts) AS last_login_ts__day + , DATE_TRUNC('week', users_ds_source_src_28000.last_login_ts) AS last_login_ts__week + , DATE_TRUNC('month', users_ds_source_src_28000.last_login_ts) AS last_login_ts__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.last_login_ts) AS last_login_ts__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.last_login_ts) AS last_login_ts__year + , EXTRACT(year FROM users_ds_source_src_28000.last_login_ts) AS last_login_ts__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.last_login_ts) AS last_login_ts__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.last_login_ts) AS last_login_ts__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.last_login_ts) AS last_login_ts__extract_day + , CASE WHEN EXTRACT(dow FROM users_ds_source_src_28000.last_login_ts) = 0 THEN EXTRACT(dow FROM users_ds_source_src_28000.last_login_ts) + 7 ELSE EXTRACT(dow FROM users_ds_source_src_28000.last_login_ts) END AS last_login_ts__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.last_login_ts) AS last_login_ts__extract_doy + , DATE_TRUNC('hour', users_ds_source_src_28000.archived_at) AS archived_at__hour + , DATE_TRUNC('day', users_ds_source_src_28000.archived_at) AS archived_at__day + , DATE_TRUNC('week', users_ds_source_src_28000.archived_at) AS archived_at__week + , DATE_TRUNC('month', users_ds_source_src_28000.archived_at) AS archived_at__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.archived_at) AS archived_at__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.archived_at) AS archived_at__year + , EXTRACT(year FROM users_ds_source_src_28000.archived_at) AS archived_at__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.archived_at) AS archived_at__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.archived_at) AS archived_at__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.archived_at) AS archived_at__extract_day + , CASE WHEN EXTRACT(dow FROM users_ds_source_src_28000.archived_at) = 0 THEN EXTRACT(dow FROM users_ds_source_src_28000.archived_at) + 7 ELSE EXTRACT(dow FROM users_ds_source_src_28000.archived_at) END AS archived_at__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.archived_at) AS archived_at__extract_doy + , DATE_TRUNC('day', users_ds_source_src_28000.ds) AS user__ds__day + , DATE_TRUNC('week', users_ds_source_src_28000.ds) AS user__ds__week + , DATE_TRUNC('month', users_ds_source_src_28000.ds) AS user__ds__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.ds) AS user__ds__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.ds) AS user__ds__year + , EXTRACT(year FROM users_ds_source_src_28000.ds) AS user__ds__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.ds) AS user__ds__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.ds) AS user__ds__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.ds) AS user__ds__extract_day + , CASE WHEN EXTRACT(dow FROM users_ds_source_src_28000.ds) = 0 THEN EXTRACT(dow FROM users_ds_source_src_28000.ds) + 7 ELSE EXTRACT(dow FROM users_ds_source_src_28000.ds) END AS user__ds__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.ds) AS user__ds__extract_doy + , DATE_TRUNC('day', users_ds_source_src_28000.created_at) AS user__created_at__day + , DATE_TRUNC('week', users_ds_source_src_28000.created_at) AS user__created_at__week + , DATE_TRUNC('month', users_ds_source_src_28000.created_at) AS user__created_at__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.created_at) AS user__created_at__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.created_at) AS user__created_at__year + , EXTRACT(year FROM users_ds_source_src_28000.created_at) AS user__created_at__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.created_at) AS user__created_at__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.created_at) AS user__created_at__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.created_at) AS user__created_at__extract_day + , CASE WHEN EXTRACT(dow FROM users_ds_source_src_28000.created_at) = 0 THEN EXTRACT(dow FROM users_ds_source_src_28000.created_at) + 7 ELSE EXTRACT(dow FROM users_ds_source_src_28000.created_at) END AS user__created_at__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.created_at) AS user__created_at__extract_doy + , DATE_TRUNC('day', users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__day + , DATE_TRUNC('week', users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__week + , DATE_TRUNC('month', users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__year + , EXTRACT(year FROM users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__extract_day + , CASE WHEN EXTRACT(dow FROM users_ds_source_src_28000.ds_partitioned) = 0 THEN EXTRACT(dow FROM users_ds_source_src_28000.ds_partitioned) + 7 ELSE EXTRACT(dow FROM users_ds_source_src_28000.ds_partitioned) END AS user__ds_partitioned__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__extract_doy + , users_ds_source_src_28000.home_state AS user__home_state + , DATE_TRUNC('millisecond', users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__millisecond + , DATE_TRUNC('second', users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__second + , DATE_TRUNC('minute', users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__minute + , DATE_TRUNC('hour', users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__hour + , DATE_TRUNC('day', users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__day + , DATE_TRUNC('week', users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__week + , DATE_TRUNC('month', users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__year + , EXTRACT(year FROM users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__extract_day + , CASE WHEN EXTRACT(dow FROM users_ds_source_src_28000.last_profile_edit_ts) = 0 THEN EXTRACT(dow FROM users_ds_source_src_28000.last_profile_edit_ts) + 7 ELSE EXTRACT(dow FROM users_ds_source_src_28000.last_profile_edit_ts) END AS user__last_profile_edit_ts__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__extract_doy + , DATE_TRUNC('second', users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__second + , DATE_TRUNC('minute', users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__minute + , DATE_TRUNC('hour', users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__hour + , DATE_TRUNC('day', users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__day + , DATE_TRUNC('week', users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__week + , DATE_TRUNC('month', users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__year + , EXTRACT(year FROM users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__extract_day + , CASE WHEN EXTRACT(dow FROM users_ds_source_src_28000.bio_added_ts) = 0 THEN EXTRACT(dow FROM users_ds_source_src_28000.bio_added_ts) + 7 ELSE EXTRACT(dow FROM users_ds_source_src_28000.bio_added_ts) END AS user__bio_added_ts__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__extract_doy + , DATE_TRUNC('minute', users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__minute + , DATE_TRUNC('hour', users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__hour + , DATE_TRUNC('day', users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__day + , DATE_TRUNC('week', users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__week + , DATE_TRUNC('month', users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__year + , EXTRACT(year FROM users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__extract_day + , CASE WHEN EXTRACT(dow FROM users_ds_source_src_28000.last_login_ts) = 0 THEN EXTRACT(dow FROM users_ds_source_src_28000.last_login_ts) + 7 ELSE EXTRACT(dow FROM users_ds_source_src_28000.last_login_ts) END AS user__last_login_ts__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__extract_doy + , DATE_TRUNC('hour', users_ds_source_src_28000.archived_at) AS user__archived_at__hour + , DATE_TRUNC('day', users_ds_source_src_28000.archived_at) AS user__archived_at__day + , DATE_TRUNC('week', users_ds_source_src_28000.archived_at) AS user__archived_at__week + , DATE_TRUNC('month', users_ds_source_src_28000.archived_at) AS user__archived_at__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.archived_at) AS user__archived_at__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.archived_at) AS user__archived_at__year + , EXTRACT(year FROM users_ds_source_src_28000.archived_at) AS user__archived_at__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.archived_at) AS user__archived_at__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.archived_at) AS user__archived_at__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.archived_at) AS user__archived_at__extract_day + , CASE WHEN EXTRACT(dow FROM users_ds_source_src_28000.archived_at) = 0 THEN EXTRACT(dow FROM users_ds_source_src_28000.archived_at) + 7 ELSE EXTRACT(dow FROM users_ds_source_src_28000.archived_at) END AS user__archived_at__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.archived_at) AS user__archived_at__extract_doy + , users_ds_source_src_28000.user_id AS user + FROM ***************************.dim_users users_ds_source_src_28000 + ) subq_5 + ) subq_6 + ON + subq_13.ts__hour = subq_6.metric_time__hour + ) subq_14 + ) subq_15 + GROUP BY + subq_15.metric_time__hour + ) subq_16 +) subq_17 diff --git a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Redshift/test_custom_offset_window_with_multiple_time_spines__plan0_optimized.sql b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Redshift/test_custom_offset_window_with_multiple_time_spines__plan0_optimized.sql new file mode 100644 index 0000000000..de855225e7 --- /dev/null +++ b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Redshift/test_custom_offset_window_with_multiple_time_spines__plan0_optimized.sql @@ -0,0 +1,87 @@ +test_name: test_custom_offset_window_with_multiple_time_spines +test_filename: test_custom_granularity.py +sql_engine: Redshift +--- +-- Compute Metrics via Expressions +SELECT + metric_time__hour + , archived_users AS archived_users_offset_1_martian_day +FROM ( + -- Join to Time Spine Dataset + -- Pass Only Elements: ['archived_users', 'metric_time__hour'] + -- Aggregate Measures + -- Compute Metrics via Expressions + SELECT + subq_29.ts__hour__lead AS metric_time__hour + , SUM(subq_24.archived_users) AS archived_users + FROM ( + -- Offset Base Granularity By Custom Granularity Period(s) + WITH cte_6 AS ( + -- Get Custom Granularity Bounds + SELECT + time_spine_src_28005.ts AS ts__hour + , time_spine_src_28006.martian_day AS ds__martian_day + , FIRST_VALUE(time_spine_src_28005.ts) OVER ( + PARTITION BY time_spine_src_28006.martian_day + ORDER BY time_spine_src_28005.ts + ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING + ) AS ts__hour__first_value + , LAST_VALUE(time_spine_src_28005.ts) OVER ( + PARTITION BY time_spine_src_28006.martian_day + ORDER BY time_spine_src_28005.ts + ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING + ) AS ts__hour__last_value + , ROW_NUMBER() OVER ( + PARTITION BY time_spine_src_28006.martian_day + ORDER BY time_spine_src_28005.ts + ) AS ts__hour__row_number + FROM ***************************.mf_time_spine time_spine_src_28006 + INNER JOIN + ***************************.mf_time_spine_hour time_spine_src_28005 + ON + time_spine_src_28006.ds = DATE_TRUNC('day', time_spine_src_28005.ts) + ) + + SELECT + cte_6.ts__hour AS ts__hour + , CASE + WHEN DATEADD(hour, (cte_6.ts__hour__row_number - 1), subq_28.ts__hour__first_value__lead) <= subq_28.ts__hour__last_value__lead + THEN DATEADD(hour, (cte_6.ts__hour__row_number - 1), subq_28.ts__hour__first_value__lead) + ELSE NULL + END AS ts__hour__lead + FROM cte_6 cte_6 + INNER JOIN ( + -- Offset Custom Granularity Bounds + SELECT + ds__martian_day + , LEAD(ts__hour__first_value, 1) OVER (ORDER BY ds__martian_day) AS ts__hour__first_value__lead + , LEAD(ts__hour__last_value, 1) OVER (ORDER BY ds__martian_day) AS ts__hour__last_value__lead + FROM ( + -- Get Unique Rows for Custom Granularity Bounds + SELECT + ds__martian_day + , ts__hour__first_value + , ts__hour__last_value + FROM cte_6 cte_6 + GROUP BY + ds__martian_day + , ts__hour__first_value + , ts__hour__last_value + ) subq_27 + ) subq_28 + ON + cte_6.ds__martian_day = subq_28.ds__martian_day + ) subq_29 + INNER JOIN ( + -- Read Elements From Semantic Model 'users_ds_source' + -- Metric Time Dimension 'archived_at' + SELECT + DATE_TRUNC('hour', archived_at) AS metric_time__hour + , 1 AS archived_users + FROM ***************************.dim_users users_ds_source_src_28000 + ) subq_24 + ON + subq_29.ts__hour = subq_24.metric_time__hour + GROUP BY + subq_29.ts__hour__lead +) subq_35 diff --git a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Snowflake/test_custom_offset_window__plan0.sql b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Snowflake/test_custom_offset_window__plan0.sql index db004c031c..5be9b5313b 100644 --- a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Snowflake/test_custom_offset_window__plan0.sql +++ b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Snowflake/test_custom_offset_window__plan0.sql @@ -137,28 +137,18 @@ FROM ( WITH cte_2 AS ( -- Get Custom Granularity Bounds SELECT - time_spine_src_28006.ds AS ds__day - , DATE_TRUNC('week', time_spine_src_28006.ds) AS ds__week - , DATE_TRUNC('month', time_spine_src_28006.ds) AS ds__month - , DATE_TRUNC('quarter', time_spine_src_28006.ds) AS ds__quarter - , DATE_TRUNC('year', time_spine_src_28006.ds) AS ds__year - , EXTRACT(year FROM time_spine_src_28006.ds) AS ds__extract_year - , EXTRACT(quarter FROM time_spine_src_28006.ds) AS ds__extract_quarter - , EXTRACT(month FROM time_spine_src_28006.ds) AS ds__extract_month - , EXTRACT(day FROM time_spine_src_28006.ds) AS ds__extract_day - , EXTRACT(dayofweekiso FROM time_spine_src_28006.ds) AS ds__extract_dow - , EXTRACT(doy FROM time_spine_src_28006.ds) AS ds__extract_doy - , time_spine_src_28006.martian_day AS ds__martian_day + subq_6.ds__day + , subq_6.ds__martian_day , FIRST_VALUE(subq_6.ds__day) OVER ( PARTITION BY subq_6.ds__martian_day ORDER BY subq_6.ds__day ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) AS ds__martian_day__first_value + ) AS ds__day__first_value , LAST_VALUE(subq_6.ds__day) OVER ( PARTITION BY subq_6.ds__martian_day ORDER BY subq_6.ds__day ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) AS ds__martian_day__last_value + ) AS ds__day__last_value , ROW_NUMBER() OVER ( PARTITION BY subq_6.ds__martian_day ORDER BY subq_6.ds__day @@ -185,8 +175,8 @@ FROM ( SELECT cte_2.ds__day AS ds__day , CASE - WHEN DATEADD(day, (cte_2.ds__day__row_number - 1), subq_8.ds__martian_day__first_value__lead) <= subq_8.ds__martian_day__last_value__lead - THEN DATEADD(day, (cte_2.ds__day__row_number - 1), subq_8.ds__martian_day__first_value__lead) + WHEN DATEADD(day, (cte_2.ds__day__row_number - 1), subq_8.ds__day__first_value__lead) <= subq_8.ds__day__last_value__lead + THEN DATEADD(day, (cte_2.ds__day__row_number - 1), subq_8.ds__day__first_value__lead) ELSE NULL END AS ds__day__lead FROM cte_2 cte_2 @@ -194,19 +184,19 @@ FROM ( -- Offset Custom Granularity Bounds SELECT subq_7.ds__martian_day - , LEAD(subq_7.ds__martian_day__first_value, 1) OVER (ORDER BY subq_7.ds__martian_day) AS ds__martian_day__first_value__lead - , LEAD(subq_7.ds__martian_day__last_value, 1) OVER (ORDER BY subq_7.ds__martian_day) AS ds__martian_day__last_value__lead + , LEAD(subq_7.ds__day__first_value, 1) OVER (ORDER BY subq_7.ds__martian_day) AS ds__day__first_value__lead + , LEAD(subq_7.ds__day__last_value, 1) OVER (ORDER BY subq_7.ds__martian_day) AS ds__day__last_value__lead FROM ( -- Get Unique Rows for Custom Granularity Bounds SELECT cte_2.ds__martian_day - , cte_2.ds__martian_day__first_value - , cte_2.ds__martian_day__last_value + , cte_2.ds__day__first_value + , cte_2.ds__day__last_value FROM cte_2 cte_2 GROUP BY cte_2.ds__martian_day - , cte_2.ds__martian_day__first_value - , cte_2.ds__martian_day__last_value + , cte_2.ds__day__first_value + , cte_2.ds__day__last_value ) subq_7 ) subq_8 ON diff --git a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Snowflake/test_custom_offset_window__plan0_optimized.sql b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Snowflake/test_custom_offset_window__plan0_optimized.sql index 5154e5d282..db37bcec42 100644 --- a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Snowflake/test_custom_offset_window__plan0_optimized.sql +++ b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Snowflake/test_custom_offset_window__plan0_optimized.sql @@ -26,12 +26,12 @@ FROM ( PARTITION BY martian_day ORDER BY ds ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) AS ds__martian_day__first_value + ) AS ds__day__first_value , LAST_VALUE(ds) OVER ( PARTITION BY martian_day ORDER BY ds ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) AS ds__martian_day__last_value + ) AS ds__day__last_value , ROW_NUMBER() OVER ( PARTITION BY martian_day ORDER BY ds @@ -42,8 +42,8 @@ FROM ( SELECT cte_6.ds__day AS ds__day , CASE - WHEN DATEADD(day, (cte_6.ds__day__row_number - 1), subq_24.ds__martian_day__first_value__lead) <= subq_24.ds__martian_day__last_value__lead - THEN DATEADD(day, (cte_6.ds__day__row_number - 1), subq_24.ds__martian_day__first_value__lead) + WHEN DATEADD(day, (cte_6.ds__day__row_number - 1), subq_24.ds__day__first_value__lead) <= subq_24.ds__day__last_value__lead + THEN DATEADD(day, (cte_6.ds__day__row_number - 1), subq_24.ds__day__first_value__lead) ELSE NULL END AS ds__day__lead FROM cte_6 cte_6 @@ -51,19 +51,19 @@ FROM ( -- Offset Custom Granularity Bounds SELECT ds__martian_day - , LEAD(ds__martian_day__first_value, 1) OVER (ORDER BY ds__martian_day) AS ds__martian_day__first_value__lead - , LEAD(ds__martian_day__last_value, 1) OVER (ORDER BY ds__martian_day) AS ds__martian_day__last_value__lead + , LEAD(ds__day__first_value, 1) OVER (ORDER BY ds__martian_day) AS ds__day__first_value__lead + , LEAD(ds__day__last_value, 1) OVER (ORDER BY ds__martian_day) AS ds__day__last_value__lead FROM ( -- Get Unique Rows for Custom Granularity Bounds SELECT ds__martian_day - , ds__martian_day__first_value - , ds__martian_day__last_value + , ds__day__first_value + , ds__day__last_value FROM cte_6 cte_6 GROUP BY ds__martian_day - , ds__martian_day__first_value - , ds__martian_day__last_value + , ds__day__first_value + , ds__day__last_value ) subq_23 ) subq_24 ON diff --git a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Snowflake/test_custom_offset_window_with_granularity_and_date_part__plan0.sql b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Snowflake/test_custom_offset_window_with_granularity_and_date_part__plan0.sql index fd65d72394..96d07a8f8a 100644 --- a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Snowflake/test_custom_offset_window_with_granularity_and_date_part__plan0.sql +++ b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Snowflake/test_custom_offset_window_with_granularity_and_date_part__plan0.sql @@ -151,28 +151,18 @@ FROM ( WITH cte_2 AS ( -- Get Custom Granularity Bounds SELECT - time_spine_src_28006.ds AS ds__day - , DATE_TRUNC('week', time_spine_src_28006.ds) AS ds__week - , DATE_TRUNC('month', time_spine_src_28006.ds) AS ds__month - , DATE_TRUNC('quarter', time_spine_src_28006.ds) AS ds__quarter - , DATE_TRUNC('year', time_spine_src_28006.ds) AS ds__year - , EXTRACT(year FROM time_spine_src_28006.ds) AS ds__extract_year - , EXTRACT(quarter FROM time_spine_src_28006.ds) AS ds__extract_quarter - , EXTRACT(month FROM time_spine_src_28006.ds) AS ds__extract_month - , EXTRACT(day FROM time_spine_src_28006.ds) AS ds__extract_day - , EXTRACT(dayofweekiso FROM time_spine_src_28006.ds) AS ds__extract_dow - , EXTRACT(doy FROM time_spine_src_28006.ds) AS ds__extract_doy - , time_spine_src_28006.martian_day AS ds__martian_day + subq_6.ds__day + , subq_6.ds__martian_day , FIRST_VALUE(subq_6.ds__day) OVER ( PARTITION BY subq_6.ds__martian_day ORDER BY subq_6.ds__day ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) AS ds__martian_day__first_value + ) AS ds__day__first_value , LAST_VALUE(subq_6.ds__day) OVER ( PARTITION BY subq_6.ds__martian_day ORDER BY subq_6.ds__day ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) AS ds__martian_day__last_value + ) AS ds__day__last_value , ROW_NUMBER() OVER ( PARTITION BY subq_6.ds__martian_day ORDER BY subq_6.ds__day @@ -199,8 +189,8 @@ FROM ( SELECT cte_2.ds__day AS ds__day , CASE - WHEN DATEADD(day, (cte_2.ds__day__row_number - 1), subq_8.ds__martian_day__first_value__lead) <= subq_8.ds__martian_day__last_value__lead - THEN DATEADD(day, (cte_2.ds__day__row_number - 1), subq_8.ds__martian_day__first_value__lead) + WHEN DATEADD(day, (cte_2.ds__day__row_number - 1), subq_8.ds__day__first_value__lead) <= subq_8.ds__day__last_value__lead + THEN DATEADD(day, (cte_2.ds__day__row_number - 1), subq_8.ds__day__first_value__lead) ELSE NULL END AS ds__day__lead FROM cte_2 cte_2 @@ -208,19 +198,19 @@ FROM ( -- Offset Custom Granularity Bounds SELECT subq_7.ds__martian_day - , LEAD(subq_7.ds__martian_day__first_value, 1) OVER (ORDER BY subq_7.ds__martian_day) AS ds__martian_day__first_value__lead - , LEAD(subq_7.ds__martian_day__last_value, 1) OVER (ORDER BY subq_7.ds__martian_day) AS ds__martian_day__last_value__lead + , LEAD(subq_7.ds__day__first_value, 1) OVER (ORDER BY subq_7.ds__martian_day) AS ds__day__first_value__lead + , LEAD(subq_7.ds__day__last_value, 1) OVER (ORDER BY subq_7.ds__martian_day) AS ds__day__last_value__lead FROM ( -- Get Unique Rows for Custom Granularity Bounds SELECT cte_2.ds__martian_day - , cte_2.ds__martian_day__first_value - , cte_2.ds__martian_day__last_value + , cte_2.ds__day__first_value + , cte_2.ds__day__last_value FROM cte_2 cte_2 GROUP BY cte_2.ds__martian_day - , cte_2.ds__martian_day__first_value - , cte_2.ds__martian_day__last_value + , cte_2.ds__day__first_value + , cte_2.ds__day__last_value ) subq_7 ) subq_8 ON diff --git a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Snowflake/test_custom_offset_window_with_granularity_and_date_part__plan0_optimized.sql b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Snowflake/test_custom_offset_window_with_granularity_and_date_part__plan0_optimized.sql index 47332c97e4..b70a16822c 100644 --- a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Snowflake/test_custom_offset_window_with_granularity_and_date_part__plan0_optimized.sql +++ b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Snowflake/test_custom_offset_window_with_granularity_and_date_part__plan0_optimized.sql @@ -31,12 +31,12 @@ FROM ( PARTITION BY martian_day ORDER BY ds ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) AS ds__martian_day__first_value + ) AS ds__day__first_value , LAST_VALUE(ds) OVER ( PARTITION BY martian_day ORDER BY ds ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) AS ds__martian_day__last_value + ) AS ds__day__last_value , ROW_NUMBER() OVER ( PARTITION BY martian_day ORDER BY ds @@ -47,8 +47,8 @@ FROM ( SELECT cte_6.ds__day AS ds__day , CASE - WHEN DATEADD(day, (cte_6.ds__day__row_number - 1), subq_25.ds__martian_day__first_value__lead) <= subq_25.ds__martian_day__last_value__lead - THEN DATEADD(day, (cte_6.ds__day__row_number - 1), subq_25.ds__martian_day__first_value__lead) + WHEN DATEADD(day, (cte_6.ds__day__row_number - 1), subq_25.ds__day__first_value__lead) <= subq_25.ds__day__last_value__lead + THEN DATEADD(day, (cte_6.ds__day__row_number - 1), subq_25.ds__day__first_value__lead) ELSE NULL END AS ds__day__lead FROM cte_6 cte_6 @@ -56,19 +56,19 @@ FROM ( -- Offset Custom Granularity Bounds SELECT ds__martian_day - , LEAD(ds__martian_day__first_value, 1) OVER (ORDER BY ds__martian_day) AS ds__martian_day__first_value__lead - , LEAD(ds__martian_day__last_value, 1) OVER (ORDER BY ds__martian_day) AS ds__martian_day__last_value__lead + , LEAD(ds__day__first_value, 1) OVER (ORDER BY ds__martian_day) AS ds__day__first_value__lead + , LEAD(ds__day__last_value, 1) OVER (ORDER BY ds__martian_day) AS ds__day__last_value__lead FROM ( -- Get Unique Rows for Custom Granularity Bounds SELECT ds__martian_day - , ds__martian_day__first_value - , ds__martian_day__last_value + , ds__day__first_value + , ds__day__last_value FROM cte_6 cte_6 GROUP BY ds__martian_day - , ds__martian_day__first_value - , ds__martian_day__last_value + , ds__day__first_value + , ds__day__last_value ) subq_24 ) subq_25 ON diff --git a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Snowflake/test_custom_offset_window_with_multiple_time_spines__plan0.sql b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Snowflake/test_custom_offset_window_with_multiple_time_spines__plan0.sql new file mode 100644 index 0000000000..0b79923567 --- /dev/null +++ b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Snowflake/test_custom_offset_window_with_multiple_time_spines__plan0.sql @@ -0,0 +1,703 @@ +test_name: test_custom_offset_window_with_multiple_time_spines +test_filename: test_custom_granularity.py +sql_engine: Snowflake +--- +-- Compute Metrics via Expressions +SELECT + subq_17.metric_time__hour + , archived_users AS archived_users_offset_1_martian_day +FROM ( + -- Compute Metrics via Expressions + SELECT + subq_16.metric_time__hour + , subq_16.archived_users + FROM ( + -- Aggregate Measures + SELECT + subq_15.metric_time__hour + , SUM(subq_15.archived_users) AS archived_users + FROM ( + -- Pass Only Elements: ['archived_users', 'metric_time__hour'] + SELECT + subq_14.metric_time__hour + , subq_14.archived_users + FROM ( + -- Join to Time Spine Dataset + SELECT + subq_13.metric_time__hour AS metric_time__hour + , subq_6.ds__day AS ds__day + , subq_6.ds__week AS ds__week + , subq_6.ds__month AS ds__month + , subq_6.ds__quarter AS ds__quarter + , subq_6.ds__year AS ds__year + , subq_6.ds__extract_year AS ds__extract_year + , subq_6.ds__extract_quarter AS ds__extract_quarter + , subq_6.ds__extract_month AS ds__extract_month + , subq_6.ds__extract_day AS ds__extract_day + , subq_6.ds__extract_dow AS ds__extract_dow + , subq_6.ds__extract_doy AS ds__extract_doy + , subq_6.created_at__day AS created_at__day + , subq_6.created_at__week AS created_at__week + , subq_6.created_at__month AS created_at__month + , subq_6.created_at__quarter AS created_at__quarter + , subq_6.created_at__year AS created_at__year + , subq_6.created_at__extract_year AS created_at__extract_year + , subq_6.created_at__extract_quarter AS created_at__extract_quarter + , subq_6.created_at__extract_month AS created_at__extract_month + , subq_6.created_at__extract_day AS created_at__extract_day + , subq_6.created_at__extract_dow AS created_at__extract_dow + , subq_6.created_at__extract_doy AS created_at__extract_doy + , subq_6.ds_partitioned__day AS ds_partitioned__day + , subq_6.ds_partitioned__week AS ds_partitioned__week + , subq_6.ds_partitioned__month AS ds_partitioned__month + , subq_6.ds_partitioned__quarter AS ds_partitioned__quarter + , subq_6.ds_partitioned__year AS ds_partitioned__year + , subq_6.ds_partitioned__extract_year AS ds_partitioned__extract_year + , subq_6.ds_partitioned__extract_quarter AS ds_partitioned__extract_quarter + , subq_6.ds_partitioned__extract_month AS ds_partitioned__extract_month + , subq_6.ds_partitioned__extract_day AS ds_partitioned__extract_day + , subq_6.ds_partitioned__extract_dow AS ds_partitioned__extract_dow + , subq_6.ds_partitioned__extract_doy AS ds_partitioned__extract_doy + , subq_6.last_profile_edit_ts__millisecond AS last_profile_edit_ts__millisecond + , subq_6.last_profile_edit_ts__second AS last_profile_edit_ts__second + , subq_6.last_profile_edit_ts__minute AS last_profile_edit_ts__minute + , subq_6.last_profile_edit_ts__hour AS last_profile_edit_ts__hour + , subq_6.last_profile_edit_ts__day AS last_profile_edit_ts__day + , subq_6.last_profile_edit_ts__week AS last_profile_edit_ts__week + , subq_6.last_profile_edit_ts__month AS last_profile_edit_ts__month + , subq_6.last_profile_edit_ts__quarter AS last_profile_edit_ts__quarter + , subq_6.last_profile_edit_ts__year AS last_profile_edit_ts__year + , subq_6.last_profile_edit_ts__extract_year AS last_profile_edit_ts__extract_year + , subq_6.last_profile_edit_ts__extract_quarter AS last_profile_edit_ts__extract_quarter + , subq_6.last_profile_edit_ts__extract_month AS last_profile_edit_ts__extract_month + , subq_6.last_profile_edit_ts__extract_day AS last_profile_edit_ts__extract_day + , subq_6.last_profile_edit_ts__extract_dow AS last_profile_edit_ts__extract_dow + , subq_6.last_profile_edit_ts__extract_doy AS last_profile_edit_ts__extract_doy + , subq_6.bio_added_ts__second AS bio_added_ts__second + , subq_6.bio_added_ts__minute AS bio_added_ts__minute + , subq_6.bio_added_ts__hour AS bio_added_ts__hour + , subq_6.bio_added_ts__day AS bio_added_ts__day + , subq_6.bio_added_ts__week AS bio_added_ts__week + , subq_6.bio_added_ts__month AS bio_added_ts__month + , subq_6.bio_added_ts__quarter AS bio_added_ts__quarter + , subq_6.bio_added_ts__year AS bio_added_ts__year + , subq_6.bio_added_ts__extract_year AS bio_added_ts__extract_year + , subq_6.bio_added_ts__extract_quarter AS bio_added_ts__extract_quarter + , subq_6.bio_added_ts__extract_month AS bio_added_ts__extract_month + , subq_6.bio_added_ts__extract_day AS bio_added_ts__extract_day + , subq_6.bio_added_ts__extract_dow AS bio_added_ts__extract_dow + , subq_6.bio_added_ts__extract_doy AS bio_added_ts__extract_doy + , subq_6.last_login_ts__minute AS last_login_ts__minute + , subq_6.last_login_ts__hour AS last_login_ts__hour + , subq_6.last_login_ts__day AS last_login_ts__day + , subq_6.last_login_ts__week AS last_login_ts__week + , subq_6.last_login_ts__month AS last_login_ts__month + , subq_6.last_login_ts__quarter AS last_login_ts__quarter + , subq_6.last_login_ts__year AS last_login_ts__year + , subq_6.last_login_ts__extract_year AS last_login_ts__extract_year + , subq_6.last_login_ts__extract_quarter AS last_login_ts__extract_quarter + , subq_6.last_login_ts__extract_month AS last_login_ts__extract_month + , subq_6.last_login_ts__extract_day AS last_login_ts__extract_day + , subq_6.last_login_ts__extract_dow AS last_login_ts__extract_dow + , subq_6.last_login_ts__extract_doy AS last_login_ts__extract_doy + , subq_6.archived_at__hour AS archived_at__hour + , subq_6.archived_at__day AS archived_at__day + , subq_6.archived_at__week AS archived_at__week + , subq_6.archived_at__month AS archived_at__month + , subq_6.archived_at__quarter AS archived_at__quarter + , subq_6.archived_at__year AS archived_at__year + , subq_6.archived_at__extract_year AS archived_at__extract_year + , subq_6.archived_at__extract_quarter AS archived_at__extract_quarter + , subq_6.archived_at__extract_month AS archived_at__extract_month + , subq_6.archived_at__extract_day AS archived_at__extract_day + , subq_6.archived_at__extract_dow AS archived_at__extract_dow + , subq_6.archived_at__extract_doy AS archived_at__extract_doy + , subq_6.user__ds__day AS user__ds__day + , subq_6.user__ds__week AS user__ds__week + , subq_6.user__ds__month AS user__ds__month + , subq_6.user__ds__quarter AS user__ds__quarter + , subq_6.user__ds__year AS user__ds__year + , subq_6.user__ds__extract_year AS user__ds__extract_year + , subq_6.user__ds__extract_quarter AS user__ds__extract_quarter + , subq_6.user__ds__extract_month AS user__ds__extract_month + , subq_6.user__ds__extract_day AS user__ds__extract_day + , subq_6.user__ds__extract_dow AS user__ds__extract_dow + , subq_6.user__ds__extract_doy AS user__ds__extract_doy + , subq_6.user__created_at__day AS user__created_at__day + , subq_6.user__created_at__week AS user__created_at__week + , subq_6.user__created_at__month AS user__created_at__month + , subq_6.user__created_at__quarter AS user__created_at__quarter + , subq_6.user__created_at__year AS user__created_at__year + , subq_6.user__created_at__extract_year AS user__created_at__extract_year + , subq_6.user__created_at__extract_quarter AS user__created_at__extract_quarter + , subq_6.user__created_at__extract_month AS user__created_at__extract_month + , subq_6.user__created_at__extract_day AS user__created_at__extract_day + , subq_6.user__created_at__extract_dow AS user__created_at__extract_dow + , subq_6.user__created_at__extract_doy AS user__created_at__extract_doy + , subq_6.user__ds_partitioned__day AS user__ds_partitioned__day + , subq_6.user__ds_partitioned__week AS user__ds_partitioned__week + , subq_6.user__ds_partitioned__month AS user__ds_partitioned__month + , subq_6.user__ds_partitioned__quarter AS user__ds_partitioned__quarter + , subq_6.user__ds_partitioned__year AS user__ds_partitioned__year + , subq_6.user__ds_partitioned__extract_year AS user__ds_partitioned__extract_year + , subq_6.user__ds_partitioned__extract_quarter AS user__ds_partitioned__extract_quarter + , subq_6.user__ds_partitioned__extract_month AS user__ds_partitioned__extract_month + , subq_6.user__ds_partitioned__extract_day AS user__ds_partitioned__extract_day + , subq_6.user__ds_partitioned__extract_dow AS user__ds_partitioned__extract_dow + , subq_6.user__ds_partitioned__extract_doy AS user__ds_partitioned__extract_doy + , subq_6.user__last_profile_edit_ts__millisecond AS user__last_profile_edit_ts__millisecond + , subq_6.user__last_profile_edit_ts__second AS user__last_profile_edit_ts__second + , subq_6.user__last_profile_edit_ts__minute AS user__last_profile_edit_ts__minute + , subq_6.user__last_profile_edit_ts__hour AS user__last_profile_edit_ts__hour + , subq_6.user__last_profile_edit_ts__day AS user__last_profile_edit_ts__day + , subq_6.user__last_profile_edit_ts__week AS user__last_profile_edit_ts__week + , subq_6.user__last_profile_edit_ts__month AS user__last_profile_edit_ts__month + , subq_6.user__last_profile_edit_ts__quarter AS user__last_profile_edit_ts__quarter + , subq_6.user__last_profile_edit_ts__year AS user__last_profile_edit_ts__year + , subq_6.user__last_profile_edit_ts__extract_year AS user__last_profile_edit_ts__extract_year + , subq_6.user__last_profile_edit_ts__extract_quarter AS user__last_profile_edit_ts__extract_quarter + , subq_6.user__last_profile_edit_ts__extract_month AS user__last_profile_edit_ts__extract_month + , subq_6.user__last_profile_edit_ts__extract_day AS user__last_profile_edit_ts__extract_day + , subq_6.user__last_profile_edit_ts__extract_dow AS user__last_profile_edit_ts__extract_dow + , subq_6.user__last_profile_edit_ts__extract_doy AS user__last_profile_edit_ts__extract_doy + , subq_6.user__bio_added_ts__second AS user__bio_added_ts__second + , subq_6.user__bio_added_ts__minute AS user__bio_added_ts__minute + , subq_6.user__bio_added_ts__hour AS user__bio_added_ts__hour + , subq_6.user__bio_added_ts__day AS user__bio_added_ts__day + , subq_6.user__bio_added_ts__week AS user__bio_added_ts__week + , subq_6.user__bio_added_ts__month AS user__bio_added_ts__month + , subq_6.user__bio_added_ts__quarter AS user__bio_added_ts__quarter + , subq_6.user__bio_added_ts__year AS user__bio_added_ts__year + , subq_6.user__bio_added_ts__extract_year AS user__bio_added_ts__extract_year + , subq_6.user__bio_added_ts__extract_quarter AS user__bio_added_ts__extract_quarter + , subq_6.user__bio_added_ts__extract_month AS user__bio_added_ts__extract_month + , subq_6.user__bio_added_ts__extract_day AS user__bio_added_ts__extract_day + , subq_6.user__bio_added_ts__extract_dow AS user__bio_added_ts__extract_dow + , subq_6.user__bio_added_ts__extract_doy AS user__bio_added_ts__extract_doy + , subq_6.user__last_login_ts__minute AS user__last_login_ts__minute + , subq_6.user__last_login_ts__hour AS user__last_login_ts__hour + , subq_6.user__last_login_ts__day AS user__last_login_ts__day + , subq_6.user__last_login_ts__week AS user__last_login_ts__week + , subq_6.user__last_login_ts__month AS user__last_login_ts__month + , subq_6.user__last_login_ts__quarter AS user__last_login_ts__quarter + , subq_6.user__last_login_ts__year AS user__last_login_ts__year + , subq_6.user__last_login_ts__extract_year AS user__last_login_ts__extract_year + , subq_6.user__last_login_ts__extract_quarter AS user__last_login_ts__extract_quarter + , subq_6.user__last_login_ts__extract_month AS user__last_login_ts__extract_month + , subq_6.user__last_login_ts__extract_day AS user__last_login_ts__extract_day + , subq_6.user__last_login_ts__extract_dow AS user__last_login_ts__extract_dow + , subq_6.user__last_login_ts__extract_doy AS user__last_login_ts__extract_doy + , subq_6.user__archived_at__hour AS user__archived_at__hour + , subq_6.user__archived_at__day AS user__archived_at__day + , subq_6.user__archived_at__week AS user__archived_at__week + , subq_6.user__archived_at__month AS user__archived_at__month + , subq_6.user__archived_at__quarter AS user__archived_at__quarter + , subq_6.user__archived_at__year AS user__archived_at__year + , subq_6.user__archived_at__extract_year AS user__archived_at__extract_year + , subq_6.user__archived_at__extract_quarter AS user__archived_at__extract_quarter + , subq_6.user__archived_at__extract_month AS user__archived_at__extract_month + , subq_6.user__archived_at__extract_day AS user__archived_at__extract_day + , subq_6.user__archived_at__extract_dow AS user__archived_at__extract_dow + , subq_6.user__archived_at__extract_doy AS user__archived_at__extract_doy + , subq_6.metric_time__day AS metric_time__day + , subq_6.metric_time__week AS metric_time__week + , subq_6.metric_time__month AS metric_time__month + , subq_6.metric_time__quarter AS metric_time__quarter + , subq_6.metric_time__year AS metric_time__year + , subq_6.metric_time__extract_year AS metric_time__extract_year + , subq_6.metric_time__extract_quarter AS metric_time__extract_quarter + , subq_6.metric_time__extract_month AS metric_time__extract_month + , subq_6.metric_time__extract_day AS metric_time__extract_day + , subq_6.metric_time__extract_dow AS metric_time__extract_dow + , subq_6.metric_time__extract_doy AS metric_time__extract_doy + , subq_6.user AS user + , subq_6.home_state AS home_state + , subq_6.user__home_state AS user__home_state + , subq_6.archived_users AS archived_users + FROM ( + -- Pass Only Elements: ['ts__hour', 'metric_time__hour'] + SELECT + subq_12.ts__hour + , subq_12.metric_time__hour + FROM ( + -- Apply Requested Granularities + SELECT + subq_11.ts__hour + , subq_11.ts__hour__lead AS metric_time__hour + FROM ( + -- Offset Base Granularity By Custom Granularity Period(s) + WITH cte_2 AS ( + -- Get Custom Granularity Bounds + SELECT + subq_8.ts__hour AS ts__hour + , subq_7.ds__martian_day AS ds__martian_day + , FIRST_VALUE(subq_8.ts__hour) OVER ( + PARTITION BY subq_7.ds__martian_day + ORDER BY subq_8.ts__hour + ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING + ) AS ts__hour__first_value + , LAST_VALUE(subq_8.ts__hour) OVER ( + PARTITION BY subq_7.ds__martian_day + ORDER BY subq_8.ts__hour + ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING + ) AS ts__hour__last_value + , ROW_NUMBER() OVER ( + PARTITION BY subq_7.ds__martian_day + ORDER BY subq_8.ts__hour + ) AS ts__hour__row_number + FROM ( + -- Read From Time Spine 'mf_time_spine' + SELECT + time_spine_src_28006.ds AS ds__day + , DATE_TRUNC('week', time_spine_src_28006.ds) AS ds__week + , DATE_TRUNC('month', time_spine_src_28006.ds) AS ds__month + , DATE_TRUNC('quarter', time_spine_src_28006.ds) AS ds__quarter + , DATE_TRUNC('year', time_spine_src_28006.ds) AS ds__year + , EXTRACT(year FROM time_spine_src_28006.ds) AS ds__extract_year + , EXTRACT(quarter FROM time_spine_src_28006.ds) AS ds__extract_quarter + , EXTRACT(month FROM time_spine_src_28006.ds) AS ds__extract_month + , EXTRACT(day FROM time_spine_src_28006.ds) AS ds__extract_day + , EXTRACT(dayofweekiso FROM time_spine_src_28006.ds) AS ds__extract_dow + , EXTRACT(doy FROM time_spine_src_28006.ds) AS ds__extract_doy + , time_spine_src_28006.martian_day AS ds__martian_day + FROM ***************************.mf_time_spine time_spine_src_28006 + ) subq_7 + INNER JOIN ( + -- Read From Time Spine 'mf_time_spine_hour' + SELECT + time_spine_src_28005.ts AS ts__hour + , DATE_TRUNC('day', time_spine_src_28005.ts) AS ts__day + , DATE_TRUNC('week', time_spine_src_28005.ts) AS ts__week + , DATE_TRUNC('month', time_spine_src_28005.ts) AS ts__month + , DATE_TRUNC('quarter', time_spine_src_28005.ts) AS ts__quarter + , DATE_TRUNC('year', time_spine_src_28005.ts) AS ts__year + , EXTRACT(year FROM time_spine_src_28005.ts) AS ts__extract_year + , EXTRACT(quarter FROM time_spine_src_28005.ts) AS ts__extract_quarter + , EXTRACT(month FROM time_spine_src_28005.ts) AS ts__extract_month + , EXTRACT(day FROM time_spine_src_28005.ts) AS ts__extract_day + , EXTRACT(dayofweekiso FROM time_spine_src_28005.ts) AS ts__extract_dow + , EXTRACT(doy FROM time_spine_src_28005.ts) AS ts__extract_doy + FROM ***************************.mf_time_spine_hour time_spine_src_28005 + ) subq_8 + ON + subq_7.ds__day = subq_8.ts__day + ) + + SELECT + cte_2.ts__hour AS ts__hour + , CASE + WHEN DATEADD(hour, (cte_2.ts__hour__row_number - 1), subq_10.ts__hour__first_value__lead) <= subq_10.ts__hour__last_value__lead + THEN DATEADD(hour, (cte_2.ts__hour__row_number - 1), subq_10.ts__hour__first_value__lead) + ELSE NULL + END AS ts__hour__lead + FROM cte_2 cte_2 + INNER JOIN ( + -- Offset Custom Granularity Bounds + SELECT + subq_9.ds__martian_day + , LEAD(subq_9.ts__hour__first_value, 1) OVER (ORDER BY subq_9.ds__martian_day) AS ts__hour__first_value__lead + , LEAD(subq_9.ts__hour__last_value, 1) OVER (ORDER BY subq_9.ds__martian_day) AS ts__hour__last_value__lead + FROM ( + -- Get Unique Rows for Custom Granularity Bounds + SELECT + cte_2.ds__martian_day + , cte_2.ts__hour__first_value + , cte_2.ts__hour__last_value + FROM cte_2 cte_2 + GROUP BY + cte_2.ds__martian_day + , cte_2.ts__hour__first_value + , cte_2.ts__hour__last_value + ) subq_9 + ) subq_10 + ON + cte_2.ds__martian_day = subq_10.ds__martian_day + ) subq_11 + ) subq_12 + ) subq_13 + INNER JOIN ( + -- Metric Time Dimension 'archived_at' + SELECT + subq_5.ds__day + , subq_5.ds__week + , subq_5.ds__month + , subq_5.ds__quarter + , subq_5.ds__year + , subq_5.ds__extract_year + , subq_5.ds__extract_quarter + , subq_5.ds__extract_month + , subq_5.ds__extract_day + , subq_5.ds__extract_dow + , subq_5.ds__extract_doy + , subq_5.created_at__day + , subq_5.created_at__week + , subq_5.created_at__month + , subq_5.created_at__quarter + , subq_5.created_at__year + , subq_5.created_at__extract_year + , subq_5.created_at__extract_quarter + , subq_5.created_at__extract_month + , subq_5.created_at__extract_day + , subq_5.created_at__extract_dow + , subq_5.created_at__extract_doy + , subq_5.ds_partitioned__day + , subq_5.ds_partitioned__week + , subq_5.ds_partitioned__month + , subq_5.ds_partitioned__quarter + , subq_5.ds_partitioned__year + , subq_5.ds_partitioned__extract_year + , subq_5.ds_partitioned__extract_quarter + , subq_5.ds_partitioned__extract_month + , subq_5.ds_partitioned__extract_day + , subq_5.ds_partitioned__extract_dow + , subq_5.ds_partitioned__extract_doy + , subq_5.last_profile_edit_ts__millisecond + , subq_5.last_profile_edit_ts__second + , subq_5.last_profile_edit_ts__minute + , subq_5.last_profile_edit_ts__hour + , subq_5.last_profile_edit_ts__day + , subq_5.last_profile_edit_ts__week + , subq_5.last_profile_edit_ts__month + , subq_5.last_profile_edit_ts__quarter + , subq_5.last_profile_edit_ts__year + , subq_5.last_profile_edit_ts__extract_year + , subq_5.last_profile_edit_ts__extract_quarter + , subq_5.last_profile_edit_ts__extract_month + , subq_5.last_profile_edit_ts__extract_day + , subq_5.last_profile_edit_ts__extract_dow + , subq_5.last_profile_edit_ts__extract_doy + , subq_5.bio_added_ts__second + , subq_5.bio_added_ts__minute + , subq_5.bio_added_ts__hour + , subq_5.bio_added_ts__day + , subq_5.bio_added_ts__week + , subq_5.bio_added_ts__month + , subq_5.bio_added_ts__quarter + , subq_5.bio_added_ts__year + , subq_5.bio_added_ts__extract_year + , subq_5.bio_added_ts__extract_quarter + , subq_5.bio_added_ts__extract_month + , subq_5.bio_added_ts__extract_day + , subq_5.bio_added_ts__extract_dow + , subq_5.bio_added_ts__extract_doy + , subq_5.last_login_ts__minute + , subq_5.last_login_ts__hour + , subq_5.last_login_ts__day + , subq_5.last_login_ts__week + , subq_5.last_login_ts__month + , subq_5.last_login_ts__quarter + , subq_5.last_login_ts__year + , subq_5.last_login_ts__extract_year + , subq_5.last_login_ts__extract_quarter + , subq_5.last_login_ts__extract_month + , subq_5.last_login_ts__extract_day + , subq_5.last_login_ts__extract_dow + , subq_5.last_login_ts__extract_doy + , subq_5.archived_at__hour + , subq_5.archived_at__day + , subq_5.archived_at__week + , subq_5.archived_at__month + , subq_5.archived_at__quarter + , subq_5.archived_at__year + , subq_5.archived_at__extract_year + , subq_5.archived_at__extract_quarter + , subq_5.archived_at__extract_month + , subq_5.archived_at__extract_day + , subq_5.archived_at__extract_dow + , subq_5.archived_at__extract_doy + , subq_5.user__ds__day + , subq_5.user__ds__week + , subq_5.user__ds__month + , subq_5.user__ds__quarter + , subq_5.user__ds__year + , subq_5.user__ds__extract_year + , subq_5.user__ds__extract_quarter + , subq_5.user__ds__extract_month + , subq_5.user__ds__extract_day + , subq_5.user__ds__extract_dow + , subq_5.user__ds__extract_doy + , subq_5.user__created_at__day + , subq_5.user__created_at__week + , subq_5.user__created_at__month + , subq_5.user__created_at__quarter + , subq_5.user__created_at__year + , subq_5.user__created_at__extract_year + , subq_5.user__created_at__extract_quarter + , subq_5.user__created_at__extract_month + , subq_5.user__created_at__extract_day + , subq_5.user__created_at__extract_dow + , subq_5.user__created_at__extract_doy + , subq_5.user__ds_partitioned__day + , subq_5.user__ds_partitioned__week + , subq_5.user__ds_partitioned__month + , subq_5.user__ds_partitioned__quarter + , subq_5.user__ds_partitioned__year + , subq_5.user__ds_partitioned__extract_year + , subq_5.user__ds_partitioned__extract_quarter + , subq_5.user__ds_partitioned__extract_month + , subq_5.user__ds_partitioned__extract_day + , subq_5.user__ds_partitioned__extract_dow + , subq_5.user__ds_partitioned__extract_doy + , subq_5.user__last_profile_edit_ts__millisecond + , subq_5.user__last_profile_edit_ts__second + , subq_5.user__last_profile_edit_ts__minute + , subq_5.user__last_profile_edit_ts__hour + , subq_5.user__last_profile_edit_ts__day + , subq_5.user__last_profile_edit_ts__week + , subq_5.user__last_profile_edit_ts__month + , subq_5.user__last_profile_edit_ts__quarter + , subq_5.user__last_profile_edit_ts__year + , subq_5.user__last_profile_edit_ts__extract_year + , subq_5.user__last_profile_edit_ts__extract_quarter + , subq_5.user__last_profile_edit_ts__extract_month + , subq_5.user__last_profile_edit_ts__extract_day + , subq_5.user__last_profile_edit_ts__extract_dow + , subq_5.user__last_profile_edit_ts__extract_doy + , subq_5.user__bio_added_ts__second + , subq_5.user__bio_added_ts__minute + , subq_5.user__bio_added_ts__hour + , subq_5.user__bio_added_ts__day + , subq_5.user__bio_added_ts__week + , subq_5.user__bio_added_ts__month + , subq_5.user__bio_added_ts__quarter + , subq_5.user__bio_added_ts__year + , subq_5.user__bio_added_ts__extract_year + , subq_5.user__bio_added_ts__extract_quarter + , subq_5.user__bio_added_ts__extract_month + , subq_5.user__bio_added_ts__extract_day + , subq_5.user__bio_added_ts__extract_dow + , subq_5.user__bio_added_ts__extract_doy + , subq_5.user__last_login_ts__minute + , subq_5.user__last_login_ts__hour + , subq_5.user__last_login_ts__day + , subq_5.user__last_login_ts__week + , subq_5.user__last_login_ts__month + , subq_5.user__last_login_ts__quarter + , subq_5.user__last_login_ts__year + , subq_5.user__last_login_ts__extract_year + , subq_5.user__last_login_ts__extract_quarter + , subq_5.user__last_login_ts__extract_month + , subq_5.user__last_login_ts__extract_day + , subq_5.user__last_login_ts__extract_dow + , subq_5.user__last_login_ts__extract_doy + , subq_5.user__archived_at__hour + , subq_5.user__archived_at__day + , subq_5.user__archived_at__week + , subq_5.user__archived_at__month + , subq_5.user__archived_at__quarter + , subq_5.user__archived_at__year + , subq_5.user__archived_at__extract_year + , subq_5.user__archived_at__extract_quarter + , subq_5.user__archived_at__extract_month + , subq_5.user__archived_at__extract_day + , subq_5.user__archived_at__extract_dow + , subq_5.user__archived_at__extract_doy + , subq_5.archived_at__hour AS metric_time__hour + , subq_5.archived_at__day AS metric_time__day + , subq_5.archived_at__week AS metric_time__week + , subq_5.archived_at__month AS metric_time__month + , subq_5.archived_at__quarter AS metric_time__quarter + , subq_5.archived_at__year AS metric_time__year + , subq_5.archived_at__extract_year AS metric_time__extract_year + , subq_5.archived_at__extract_quarter AS metric_time__extract_quarter + , subq_5.archived_at__extract_month AS metric_time__extract_month + , subq_5.archived_at__extract_day AS metric_time__extract_day + , subq_5.archived_at__extract_dow AS metric_time__extract_dow + , subq_5.archived_at__extract_doy AS metric_time__extract_doy + , subq_5.user + , subq_5.home_state + , subq_5.user__home_state + , subq_5.archived_users + FROM ( + -- Read Elements From Semantic Model 'users_ds_source' + SELECT + 1 AS new_users + , 1 AS archived_users + , DATE_TRUNC('day', users_ds_source_src_28000.ds) AS ds__day + , DATE_TRUNC('week', users_ds_source_src_28000.ds) AS ds__week + , DATE_TRUNC('month', users_ds_source_src_28000.ds) AS ds__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.ds) AS ds__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.ds) AS ds__year + , EXTRACT(year FROM users_ds_source_src_28000.ds) AS ds__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.ds) AS ds__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.ds) AS ds__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.ds) AS ds__extract_day + , EXTRACT(dayofweekiso FROM users_ds_source_src_28000.ds) AS ds__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.ds) AS ds__extract_doy + , DATE_TRUNC('day', users_ds_source_src_28000.created_at) AS created_at__day + , DATE_TRUNC('week', users_ds_source_src_28000.created_at) AS created_at__week + , DATE_TRUNC('month', users_ds_source_src_28000.created_at) AS created_at__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.created_at) AS created_at__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.created_at) AS created_at__year + , EXTRACT(year FROM users_ds_source_src_28000.created_at) AS created_at__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.created_at) AS created_at__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.created_at) AS created_at__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.created_at) AS created_at__extract_day + , EXTRACT(dayofweekiso FROM users_ds_source_src_28000.created_at) AS created_at__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.created_at) AS created_at__extract_doy + , DATE_TRUNC('day', users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__day + , DATE_TRUNC('week', users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__week + , DATE_TRUNC('month', users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__year + , EXTRACT(year FROM users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__extract_day + , EXTRACT(dayofweekiso FROM users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__extract_doy + , users_ds_source_src_28000.home_state + , DATE_TRUNC('millisecond', users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__millisecond + , DATE_TRUNC('second', users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__second + , DATE_TRUNC('minute', users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__minute + , DATE_TRUNC('hour', users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__hour + , DATE_TRUNC('day', users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__day + , DATE_TRUNC('week', users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__week + , DATE_TRUNC('month', users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__year + , EXTRACT(year FROM users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__extract_day + , EXTRACT(dayofweekiso FROM users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__extract_doy + , DATE_TRUNC('second', users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__second + , DATE_TRUNC('minute', users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__minute + , DATE_TRUNC('hour', users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__hour + , DATE_TRUNC('day', users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__day + , DATE_TRUNC('week', users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__week + , DATE_TRUNC('month', users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__year + , EXTRACT(year FROM users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__extract_day + , EXTRACT(dayofweekiso FROM users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__extract_doy + , DATE_TRUNC('minute', users_ds_source_src_28000.last_login_ts) AS last_login_ts__minute + , DATE_TRUNC('hour', users_ds_source_src_28000.last_login_ts) AS last_login_ts__hour + , DATE_TRUNC('day', users_ds_source_src_28000.last_login_ts) AS last_login_ts__day + , DATE_TRUNC('week', users_ds_source_src_28000.last_login_ts) AS last_login_ts__week + , DATE_TRUNC('month', users_ds_source_src_28000.last_login_ts) AS last_login_ts__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.last_login_ts) AS last_login_ts__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.last_login_ts) AS last_login_ts__year + , EXTRACT(year FROM users_ds_source_src_28000.last_login_ts) AS last_login_ts__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.last_login_ts) AS last_login_ts__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.last_login_ts) AS last_login_ts__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.last_login_ts) AS last_login_ts__extract_day + , EXTRACT(dayofweekiso FROM users_ds_source_src_28000.last_login_ts) AS last_login_ts__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.last_login_ts) AS last_login_ts__extract_doy + , DATE_TRUNC('hour', users_ds_source_src_28000.archived_at) AS archived_at__hour + , DATE_TRUNC('day', users_ds_source_src_28000.archived_at) AS archived_at__day + , DATE_TRUNC('week', users_ds_source_src_28000.archived_at) AS archived_at__week + , DATE_TRUNC('month', users_ds_source_src_28000.archived_at) AS archived_at__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.archived_at) AS archived_at__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.archived_at) AS archived_at__year + , EXTRACT(year FROM users_ds_source_src_28000.archived_at) AS archived_at__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.archived_at) AS archived_at__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.archived_at) AS archived_at__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.archived_at) AS archived_at__extract_day + , EXTRACT(dayofweekiso FROM users_ds_source_src_28000.archived_at) AS archived_at__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.archived_at) AS archived_at__extract_doy + , DATE_TRUNC('day', users_ds_source_src_28000.ds) AS user__ds__day + , DATE_TRUNC('week', users_ds_source_src_28000.ds) AS user__ds__week + , DATE_TRUNC('month', users_ds_source_src_28000.ds) AS user__ds__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.ds) AS user__ds__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.ds) AS user__ds__year + , EXTRACT(year FROM users_ds_source_src_28000.ds) AS user__ds__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.ds) AS user__ds__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.ds) AS user__ds__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.ds) AS user__ds__extract_day + , EXTRACT(dayofweekiso FROM users_ds_source_src_28000.ds) AS user__ds__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.ds) AS user__ds__extract_doy + , DATE_TRUNC('day', users_ds_source_src_28000.created_at) AS user__created_at__day + , DATE_TRUNC('week', users_ds_source_src_28000.created_at) AS user__created_at__week + , DATE_TRUNC('month', users_ds_source_src_28000.created_at) AS user__created_at__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.created_at) AS user__created_at__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.created_at) AS user__created_at__year + , EXTRACT(year FROM users_ds_source_src_28000.created_at) AS user__created_at__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.created_at) AS user__created_at__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.created_at) AS user__created_at__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.created_at) AS user__created_at__extract_day + , EXTRACT(dayofweekiso FROM users_ds_source_src_28000.created_at) AS user__created_at__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.created_at) AS user__created_at__extract_doy + , DATE_TRUNC('day', users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__day + , DATE_TRUNC('week', users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__week + , DATE_TRUNC('month', users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__year + , EXTRACT(year FROM users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__extract_day + , EXTRACT(dayofweekiso FROM users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__extract_doy + , users_ds_source_src_28000.home_state AS user__home_state + , DATE_TRUNC('millisecond', users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__millisecond + , DATE_TRUNC('second', users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__second + , DATE_TRUNC('minute', users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__minute + , DATE_TRUNC('hour', users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__hour + , DATE_TRUNC('day', users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__day + , DATE_TRUNC('week', users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__week + , DATE_TRUNC('month', users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__year + , EXTRACT(year FROM users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__extract_day + , EXTRACT(dayofweekiso FROM users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__extract_doy + , DATE_TRUNC('second', users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__second + , DATE_TRUNC('minute', users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__minute + , DATE_TRUNC('hour', users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__hour + , DATE_TRUNC('day', users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__day + , DATE_TRUNC('week', users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__week + , DATE_TRUNC('month', users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__year + , EXTRACT(year FROM users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__extract_day + , EXTRACT(dayofweekiso FROM users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__extract_doy + , DATE_TRUNC('minute', users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__minute + , DATE_TRUNC('hour', users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__hour + , DATE_TRUNC('day', users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__day + , DATE_TRUNC('week', users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__week + , DATE_TRUNC('month', users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__year + , EXTRACT(year FROM users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__extract_day + , EXTRACT(dayofweekiso FROM users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__extract_doy + , DATE_TRUNC('hour', users_ds_source_src_28000.archived_at) AS user__archived_at__hour + , DATE_TRUNC('day', users_ds_source_src_28000.archived_at) AS user__archived_at__day + , DATE_TRUNC('week', users_ds_source_src_28000.archived_at) AS user__archived_at__week + , DATE_TRUNC('month', users_ds_source_src_28000.archived_at) AS user__archived_at__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.archived_at) AS user__archived_at__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.archived_at) AS user__archived_at__year + , EXTRACT(year FROM users_ds_source_src_28000.archived_at) AS user__archived_at__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.archived_at) AS user__archived_at__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.archived_at) AS user__archived_at__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.archived_at) AS user__archived_at__extract_day + , EXTRACT(dayofweekiso FROM users_ds_source_src_28000.archived_at) AS user__archived_at__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.archived_at) AS user__archived_at__extract_doy + , users_ds_source_src_28000.user_id AS user + FROM ***************************.dim_users users_ds_source_src_28000 + ) subq_5 + ) subq_6 + ON + subq_13.ts__hour = subq_6.metric_time__hour + ) subq_14 + ) subq_15 + GROUP BY + subq_15.metric_time__hour + ) subq_16 +) subq_17 diff --git a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Snowflake/test_custom_offset_window_with_multiple_time_spines__plan0_optimized.sql b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Snowflake/test_custom_offset_window_with_multiple_time_spines__plan0_optimized.sql new file mode 100644 index 0000000000..191ee71727 --- /dev/null +++ b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Snowflake/test_custom_offset_window_with_multiple_time_spines__plan0_optimized.sql @@ -0,0 +1,87 @@ +test_name: test_custom_offset_window_with_multiple_time_spines +test_filename: test_custom_granularity.py +sql_engine: Snowflake +--- +-- Compute Metrics via Expressions +SELECT + metric_time__hour + , archived_users AS archived_users_offset_1_martian_day +FROM ( + -- Join to Time Spine Dataset + -- Pass Only Elements: ['archived_users', 'metric_time__hour'] + -- Aggregate Measures + -- Compute Metrics via Expressions + SELECT + subq_29.ts__hour__lead AS metric_time__hour + , SUM(subq_24.archived_users) AS archived_users + FROM ( + -- Offset Base Granularity By Custom Granularity Period(s) + WITH cte_6 AS ( + -- Get Custom Granularity Bounds + SELECT + time_spine_src_28005.ts AS ts__hour + , time_spine_src_28006.martian_day AS ds__martian_day + , FIRST_VALUE(time_spine_src_28005.ts) OVER ( + PARTITION BY time_spine_src_28006.martian_day + ORDER BY time_spine_src_28005.ts + ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING + ) AS ts__hour__first_value + , LAST_VALUE(time_spine_src_28005.ts) OVER ( + PARTITION BY time_spine_src_28006.martian_day + ORDER BY time_spine_src_28005.ts + ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING + ) AS ts__hour__last_value + , ROW_NUMBER() OVER ( + PARTITION BY time_spine_src_28006.martian_day + ORDER BY time_spine_src_28005.ts + ) AS ts__hour__row_number + FROM ***************************.mf_time_spine time_spine_src_28006 + INNER JOIN + ***************************.mf_time_spine_hour time_spine_src_28005 + ON + time_spine_src_28006.ds = DATE_TRUNC('day', time_spine_src_28005.ts) + ) + + SELECT + cte_6.ts__hour AS ts__hour + , CASE + WHEN DATEADD(hour, (cte_6.ts__hour__row_number - 1), subq_28.ts__hour__first_value__lead) <= subq_28.ts__hour__last_value__lead + THEN DATEADD(hour, (cte_6.ts__hour__row_number - 1), subq_28.ts__hour__first_value__lead) + ELSE NULL + END AS ts__hour__lead + FROM cte_6 cte_6 + INNER JOIN ( + -- Offset Custom Granularity Bounds + SELECT + ds__martian_day + , LEAD(ts__hour__first_value, 1) OVER (ORDER BY ds__martian_day) AS ts__hour__first_value__lead + , LEAD(ts__hour__last_value, 1) OVER (ORDER BY ds__martian_day) AS ts__hour__last_value__lead + FROM ( + -- Get Unique Rows for Custom Granularity Bounds + SELECT + ds__martian_day + , ts__hour__first_value + , ts__hour__last_value + FROM cte_6 cte_6 + GROUP BY + ds__martian_day + , ts__hour__first_value + , ts__hour__last_value + ) subq_27 + ) subq_28 + ON + cte_6.ds__martian_day = subq_28.ds__martian_day + ) subq_29 + INNER JOIN ( + -- Read Elements From Semantic Model 'users_ds_source' + -- Metric Time Dimension 'archived_at' + SELECT + DATE_TRUNC('hour', archived_at) AS metric_time__hour + , 1 AS archived_users + FROM ***************************.dim_users users_ds_source_src_28000 + ) subq_24 + ON + subq_29.ts__hour = subq_24.metric_time__hour + GROUP BY + subq_29.ts__hour__lead +) subq_35 diff --git a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Trino/test_custom_offset_window__plan0.sql b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Trino/test_custom_offset_window__plan0.sql index df9b65c77a..4d7d7cf7ff 100644 --- a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Trino/test_custom_offset_window__plan0.sql +++ b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Trino/test_custom_offset_window__plan0.sql @@ -137,28 +137,18 @@ FROM ( WITH cte_2 AS ( -- Get Custom Granularity Bounds SELECT - time_spine_src_28006.ds AS ds__day - , DATE_TRUNC('week', time_spine_src_28006.ds) AS ds__week - , DATE_TRUNC('month', time_spine_src_28006.ds) AS ds__month - , DATE_TRUNC('quarter', time_spine_src_28006.ds) AS ds__quarter - , DATE_TRUNC('year', time_spine_src_28006.ds) AS ds__year - , EXTRACT(year FROM time_spine_src_28006.ds) AS ds__extract_year - , EXTRACT(quarter FROM time_spine_src_28006.ds) AS ds__extract_quarter - , EXTRACT(month FROM time_spine_src_28006.ds) AS ds__extract_month - , EXTRACT(day FROM time_spine_src_28006.ds) AS ds__extract_day - , EXTRACT(DAY_OF_WEEK FROM time_spine_src_28006.ds) AS ds__extract_dow - , EXTRACT(doy FROM time_spine_src_28006.ds) AS ds__extract_doy - , time_spine_src_28006.martian_day AS ds__martian_day + subq_6.ds__day + , subq_6.ds__martian_day , FIRST_VALUE(subq_6.ds__day) OVER ( PARTITION BY subq_6.ds__martian_day ORDER BY subq_6.ds__day ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) AS ds__martian_day__first_value + ) AS ds__day__first_value , LAST_VALUE(subq_6.ds__day) OVER ( PARTITION BY subq_6.ds__martian_day ORDER BY subq_6.ds__day ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) AS ds__martian_day__last_value + ) AS ds__day__last_value , ROW_NUMBER() OVER ( PARTITION BY subq_6.ds__martian_day ORDER BY subq_6.ds__day @@ -185,8 +175,8 @@ FROM ( SELECT cte_2.ds__day AS ds__day , CASE - WHEN DATE_ADD('day', (cte_2.ds__day__row_number - 1), subq_8.ds__martian_day__first_value__lead) <= subq_8.ds__martian_day__last_value__lead - THEN DATE_ADD('day', (cte_2.ds__day__row_number - 1), subq_8.ds__martian_day__first_value__lead) + WHEN DATE_ADD('day', (cte_2.ds__day__row_number - 1), subq_8.ds__day__first_value__lead) <= subq_8.ds__day__last_value__lead + THEN DATE_ADD('day', (cte_2.ds__day__row_number - 1), subq_8.ds__day__first_value__lead) ELSE NULL END AS ds__day__lead FROM cte_2 cte_2 @@ -194,19 +184,19 @@ FROM ( -- Offset Custom Granularity Bounds SELECT subq_7.ds__martian_day - , LEAD(subq_7.ds__martian_day__first_value, 1) OVER (ORDER BY subq_7.ds__martian_day) AS ds__martian_day__first_value__lead - , LEAD(subq_7.ds__martian_day__last_value, 1) OVER (ORDER BY subq_7.ds__martian_day) AS ds__martian_day__last_value__lead + , LEAD(subq_7.ds__day__first_value, 1) OVER (ORDER BY subq_7.ds__martian_day) AS ds__day__first_value__lead + , LEAD(subq_7.ds__day__last_value, 1) OVER (ORDER BY subq_7.ds__martian_day) AS ds__day__last_value__lead FROM ( -- Get Unique Rows for Custom Granularity Bounds SELECT cte_2.ds__martian_day - , cte_2.ds__martian_day__first_value - , cte_2.ds__martian_day__last_value + , cte_2.ds__day__first_value + , cte_2.ds__day__last_value FROM cte_2 cte_2 GROUP BY cte_2.ds__martian_day - , cte_2.ds__martian_day__first_value - , cte_2.ds__martian_day__last_value + , cte_2.ds__day__first_value + , cte_2.ds__day__last_value ) subq_7 ) subq_8 ON diff --git a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Trino/test_custom_offset_window__plan0_optimized.sql b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Trino/test_custom_offset_window__plan0_optimized.sql index 6fae9ac1aa..27dcae06b2 100644 --- a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Trino/test_custom_offset_window__plan0_optimized.sql +++ b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Trino/test_custom_offset_window__plan0_optimized.sql @@ -26,12 +26,12 @@ FROM ( PARTITION BY martian_day ORDER BY ds ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) AS ds__martian_day__first_value + ) AS ds__day__first_value , LAST_VALUE(ds) OVER ( PARTITION BY martian_day ORDER BY ds ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) AS ds__martian_day__last_value + ) AS ds__day__last_value , ROW_NUMBER() OVER ( PARTITION BY martian_day ORDER BY ds @@ -42,8 +42,8 @@ FROM ( SELECT cte_6.ds__day AS ds__day , CASE - WHEN DATE_ADD('day', (cte_6.ds__day__row_number - 1), subq_24.ds__martian_day__first_value__lead) <= subq_24.ds__martian_day__last_value__lead - THEN DATE_ADD('day', (cte_6.ds__day__row_number - 1), subq_24.ds__martian_day__first_value__lead) + WHEN DATE_ADD('day', (cte_6.ds__day__row_number - 1), subq_24.ds__day__first_value__lead) <= subq_24.ds__day__last_value__lead + THEN DATE_ADD('day', (cte_6.ds__day__row_number - 1), subq_24.ds__day__first_value__lead) ELSE NULL END AS ds__day__lead FROM cte_6 cte_6 @@ -51,19 +51,19 @@ FROM ( -- Offset Custom Granularity Bounds SELECT ds__martian_day - , LEAD(ds__martian_day__first_value, 1) OVER (ORDER BY ds__martian_day) AS ds__martian_day__first_value__lead - , LEAD(ds__martian_day__last_value, 1) OVER (ORDER BY ds__martian_day) AS ds__martian_day__last_value__lead + , LEAD(ds__day__first_value, 1) OVER (ORDER BY ds__martian_day) AS ds__day__first_value__lead + , LEAD(ds__day__last_value, 1) OVER (ORDER BY ds__martian_day) AS ds__day__last_value__lead FROM ( -- Get Unique Rows for Custom Granularity Bounds SELECT ds__martian_day - , ds__martian_day__first_value - , ds__martian_day__last_value + , ds__day__first_value + , ds__day__last_value FROM cte_6 cte_6 GROUP BY ds__martian_day - , ds__martian_day__first_value - , ds__martian_day__last_value + , ds__day__first_value + , ds__day__last_value ) subq_23 ) subq_24 ON diff --git a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Trino/test_custom_offset_window_with_granularity_and_date_part__plan0.sql b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Trino/test_custom_offset_window_with_granularity_and_date_part__plan0.sql index 76cfc6eabf..c3a5cc93a6 100644 --- a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Trino/test_custom_offset_window_with_granularity_and_date_part__plan0.sql +++ b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Trino/test_custom_offset_window_with_granularity_and_date_part__plan0.sql @@ -151,28 +151,18 @@ FROM ( WITH cte_2 AS ( -- Get Custom Granularity Bounds SELECT - time_spine_src_28006.ds AS ds__day - , DATE_TRUNC('week', time_spine_src_28006.ds) AS ds__week - , DATE_TRUNC('month', time_spine_src_28006.ds) AS ds__month - , DATE_TRUNC('quarter', time_spine_src_28006.ds) AS ds__quarter - , DATE_TRUNC('year', time_spine_src_28006.ds) AS ds__year - , EXTRACT(year FROM time_spine_src_28006.ds) AS ds__extract_year - , EXTRACT(quarter FROM time_spine_src_28006.ds) AS ds__extract_quarter - , EXTRACT(month FROM time_spine_src_28006.ds) AS ds__extract_month - , EXTRACT(day FROM time_spine_src_28006.ds) AS ds__extract_day - , EXTRACT(DAY_OF_WEEK FROM time_spine_src_28006.ds) AS ds__extract_dow - , EXTRACT(doy FROM time_spine_src_28006.ds) AS ds__extract_doy - , time_spine_src_28006.martian_day AS ds__martian_day + subq_6.ds__day + , subq_6.ds__martian_day , FIRST_VALUE(subq_6.ds__day) OVER ( PARTITION BY subq_6.ds__martian_day ORDER BY subq_6.ds__day ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) AS ds__martian_day__first_value + ) AS ds__day__first_value , LAST_VALUE(subq_6.ds__day) OVER ( PARTITION BY subq_6.ds__martian_day ORDER BY subq_6.ds__day ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) AS ds__martian_day__last_value + ) AS ds__day__last_value , ROW_NUMBER() OVER ( PARTITION BY subq_6.ds__martian_day ORDER BY subq_6.ds__day @@ -199,8 +189,8 @@ FROM ( SELECT cte_2.ds__day AS ds__day , CASE - WHEN DATE_ADD('day', (cte_2.ds__day__row_number - 1), subq_8.ds__martian_day__first_value__lead) <= subq_8.ds__martian_day__last_value__lead - THEN DATE_ADD('day', (cte_2.ds__day__row_number - 1), subq_8.ds__martian_day__first_value__lead) + WHEN DATE_ADD('day', (cte_2.ds__day__row_number - 1), subq_8.ds__day__first_value__lead) <= subq_8.ds__day__last_value__lead + THEN DATE_ADD('day', (cte_2.ds__day__row_number - 1), subq_8.ds__day__first_value__lead) ELSE NULL END AS ds__day__lead FROM cte_2 cte_2 @@ -208,19 +198,19 @@ FROM ( -- Offset Custom Granularity Bounds SELECT subq_7.ds__martian_day - , LEAD(subq_7.ds__martian_day__first_value, 1) OVER (ORDER BY subq_7.ds__martian_day) AS ds__martian_day__first_value__lead - , LEAD(subq_7.ds__martian_day__last_value, 1) OVER (ORDER BY subq_7.ds__martian_day) AS ds__martian_day__last_value__lead + , LEAD(subq_7.ds__day__first_value, 1) OVER (ORDER BY subq_7.ds__martian_day) AS ds__day__first_value__lead + , LEAD(subq_7.ds__day__last_value, 1) OVER (ORDER BY subq_7.ds__martian_day) AS ds__day__last_value__lead FROM ( -- Get Unique Rows for Custom Granularity Bounds SELECT cte_2.ds__martian_day - , cte_2.ds__martian_day__first_value - , cte_2.ds__martian_day__last_value + , cte_2.ds__day__first_value + , cte_2.ds__day__last_value FROM cte_2 cte_2 GROUP BY cte_2.ds__martian_day - , cte_2.ds__martian_day__first_value - , cte_2.ds__martian_day__last_value + , cte_2.ds__day__first_value + , cte_2.ds__day__last_value ) subq_7 ) subq_8 ON diff --git a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Trino/test_custom_offset_window_with_granularity_and_date_part__plan0_optimized.sql b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Trino/test_custom_offset_window_with_granularity_and_date_part__plan0_optimized.sql index d63b3eb85f..1f1489bd93 100644 --- a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Trino/test_custom_offset_window_with_granularity_and_date_part__plan0_optimized.sql +++ b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Trino/test_custom_offset_window_with_granularity_and_date_part__plan0_optimized.sql @@ -31,12 +31,12 @@ FROM ( PARTITION BY martian_day ORDER BY ds ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) AS ds__martian_day__first_value + ) AS ds__day__first_value , LAST_VALUE(ds) OVER ( PARTITION BY martian_day ORDER BY ds ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING - ) AS ds__martian_day__last_value + ) AS ds__day__last_value , ROW_NUMBER() OVER ( PARTITION BY martian_day ORDER BY ds @@ -47,8 +47,8 @@ FROM ( SELECT cte_6.ds__day AS ds__day , CASE - WHEN DATE_ADD('day', (cte_6.ds__day__row_number - 1), subq_25.ds__martian_day__first_value__lead) <= subq_25.ds__martian_day__last_value__lead - THEN DATE_ADD('day', (cte_6.ds__day__row_number - 1), subq_25.ds__martian_day__first_value__lead) + WHEN DATE_ADD('day', (cte_6.ds__day__row_number - 1), subq_25.ds__day__first_value__lead) <= subq_25.ds__day__last_value__lead + THEN DATE_ADD('day', (cte_6.ds__day__row_number - 1), subq_25.ds__day__first_value__lead) ELSE NULL END AS ds__day__lead FROM cte_6 cte_6 @@ -56,19 +56,19 @@ FROM ( -- Offset Custom Granularity Bounds SELECT ds__martian_day - , LEAD(ds__martian_day__first_value, 1) OVER (ORDER BY ds__martian_day) AS ds__martian_day__first_value__lead - , LEAD(ds__martian_day__last_value, 1) OVER (ORDER BY ds__martian_day) AS ds__martian_day__last_value__lead + , LEAD(ds__day__first_value, 1) OVER (ORDER BY ds__martian_day) AS ds__day__first_value__lead + , LEAD(ds__day__last_value, 1) OVER (ORDER BY ds__martian_day) AS ds__day__last_value__lead FROM ( -- Get Unique Rows for Custom Granularity Bounds SELECT ds__martian_day - , ds__martian_day__first_value - , ds__martian_day__last_value + , ds__day__first_value + , ds__day__last_value FROM cte_6 cte_6 GROUP BY ds__martian_day - , ds__martian_day__first_value - , ds__martian_day__last_value + , ds__day__first_value + , ds__day__last_value ) subq_24 ) subq_25 ON diff --git a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Trino/test_custom_offset_window_with_multiple_time_spines__plan0.sql b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Trino/test_custom_offset_window_with_multiple_time_spines__plan0.sql new file mode 100644 index 0000000000..9e6aa114da --- /dev/null +++ b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Trino/test_custom_offset_window_with_multiple_time_spines__plan0.sql @@ -0,0 +1,703 @@ +test_name: test_custom_offset_window_with_multiple_time_spines +test_filename: test_custom_granularity.py +sql_engine: Trino +--- +-- Compute Metrics via Expressions +SELECT + subq_17.metric_time__hour + , archived_users AS archived_users_offset_1_martian_day +FROM ( + -- Compute Metrics via Expressions + SELECT + subq_16.metric_time__hour + , subq_16.archived_users + FROM ( + -- Aggregate Measures + SELECT + subq_15.metric_time__hour + , SUM(subq_15.archived_users) AS archived_users + FROM ( + -- Pass Only Elements: ['archived_users', 'metric_time__hour'] + SELECT + subq_14.metric_time__hour + , subq_14.archived_users + FROM ( + -- Join to Time Spine Dataset + SELECT + subq_13.metric_time__hour AS metric_time__hour + , subq_6.ds__day AS ds__day + , subq_6.ds__week AS ds__week + , subq_6.ds__month AS ds__month + , subq_6.ds__quarter AS ds__quarter + , subq_6.ds__year AS ds__year + , subq_6.ds__extract_year AS ds__extract_year + , subq_6.ds__extract_quarter AS ds__extract_quarter + , subq_6.ds__extract_month AS ds__extract_month + , subq_6.ds__extract_day AS ds__extract_day + , subq_6.ds__extract_dow AS ds__extract_dow + , subq_6.ds__extract_doy AS ds__extract_doy + , subq_6.created_at__day AS created_at__day + , subq_6.created_at__week AS created_at__week + , subq_6.created_at__month AS created_at__month + , subq_6.created_at__quarter AS created_at__quarter + , subq_6.created_at__year AS created_at__year + , subq_6.created_at__extract_year AS created_at__extract_year + , subq_6.created_at__extract_quarter AS created_at__extract_quarter + , subq_6.created_at__extract_month AS created_at__extract_month + , subq_6.created_at__extract_day AS created_at__extract_day + , subq_6.created_at__extract_dow AS created_at__extract_dow + , subq_6.created_at__extract_doy AS created_at__extract_doy + , subq_6.ds_partitioned__day AS ds_partitioned__day + , subq_6.ds_partitioned__week AS ds_partitioned__week + , subq_6.ds_partitioned__month AS ds_partitioned__month + , subq_6.ds_partitioned__quarter AS ds_partitioned__quarter + , subq_6.ds_partitioned__year AS ds_partitioned__year + , subq_6.ds_partitioned__extract_year AS ds_partitioned__extract_year + , subq_6.ds_partitioned__extract_quarter AS ds_partitioned__extract_quarter + , subq_6.ds_partitioned__extract_month AS ds_partitioned__extract_month + , subq_6.ds_partitioned__extract_day AS ds_partitioned__extract_day + , subq_6.ds_partitioned__extract_dow AS ds_partitioned__extract_dow + , subq_6.ds_partitioned__extract_doy AS ds_partitioned__extract_doy + , subq_6.last_profile_edit_ts__millisecond AS last_profile_edit_ts__millisecond + , subq_6.last_profile_edit_ts__second AS last_profile_edit_ts__second + , subq_6.last_profile_edit_ts__minute AS last_profile_edit_ts__minute + , subq_6.last_profile_edit_ts__hour AS last_profile_edit_ts__hour + , subq_6.last_profile_edit_ts__day AS last_profile_edit_ts__day + , subq_6.last_profile_edit_ts__week AS last_profile_edit_ts__week + , subq_6.last_profile_edit_ts__month AS last_profile_edit_ts__month + , subq_6.last_profile_edit_ts__quarter AS last_profile_edit_ts__quarter + , subq_6.last_profile_edit_ts__year AS last_profile_edit_ts__year + , subq_6.last_profile_edit_ts__extract_year AS last_profile_edit_ts__extract_year + , subq_6.last_profile_edit_ts__extract_quarter AS last_profile_edit_ts__extract_quarter + , subq_6.last_profile_edit_ts__extract_month AS last_profile_edit_ts__extract_month + , subq_6.last_profile_edit_ts__extract_day AS last_profile_edit_ts__extract_day + , subq_6.last_profile_edit_ts__extract_dow AS last_profile_edit_ts__extract_dow + , subq_6.last_profile_edit_ts__extract_doy AS last_profile_edit_ts__extract_doy + , subq_6.bio_added_ts__second AS bio_added_ts__second + , subq_6.bio_added_ts__minute AS bio_added_ts__minute + , subq_6.bio_added_ts__hour AS bio_added_ts__hour + , subq_6.bio_added_ts__day AS bio_added_ts__day + , subq_6.bio_added_ts__week AS bio_added_ts__week + , subq_6.bio_added_ts__month AS bio_added_ts__month + , subq_6.bio_added_ts__quarter AS bio_added_ts__quarter + , subq_6.bio_added_ts__year AS bio_added_ts__year + , subq_6.bio_added_ts__extract_year AS bio_added_ts__extract_year + , subq_6.bio_added_ts__extract_quarter AS bio_added_ts__extract_quarter + , subq_6.bio_added_ts__extract_month AS bio_added_ts__extract_month + , subq_6.bio_added_ts__extract_day AS bio_added_ts__extract_day + , subq_6.bio_added_ts__extract_dow AS bio_added_ts__extract_dow + , subq_6.bio_added_ts__extract_doy AS bio_added_ts__extract_doy + , subq_6.last_login_ts__minute AS last_login_ts__minute + , subq_6.last_login_ts__hour AS last_login_ts__hour + , subq_6.last_login_ts__day AS last_login_ts__day + , subq_6.last_login_ts__week AS last_login_ts__week + , subq_6.last_login_ts__month AS last_login_ts__month + , subq_6.last_login_ts__quarter AS last_login_ts__quarter + , subq_6.last_login_ts__year AS last_login_ts__year + , subq_6.last_login_ts__extract_year AS last_login_ts__extract_year + , subq_6.last_login_ts__extract_quarter AS last_login_ts__extract_quarter + , subq_6.last_login_ts__extract_month AS last_login_ts__extract_month + , subq_6.last_login_ts__extract_day AS last_login_ts__extract_day + , subq_6.last_login_ts__extract_dow AS last_login_ts__extract_dow + , subq_6.last_login_ts__extract_doy AS last_login_ts__extract_doy + , subq_6.archived_at__hour AS archived_at__hour + , subq_6.archived_at__day AS archived_at__day + , subq_6.archived_at__week AS archived_at__week + , subq_6.archived_at__month AS archived_at__month + , subq_6.archived_at__quarter AS archived_at__quarter + , subq_6.archived_at__year AS archived_at__year + , subq_6.archived_at__extract_year AS archived_at__extract_year + , subq_6.archived_at__extract_quarter AS archived_at__extract_quarter + , subq_6.archived_at__extract_month AS archived_at__extract_month + , subq_6.archived_at__extract_day AS archived_at__extract_day + , subq_6.archived_at__extract_dow AS archived_at__extract_dow + , subq_6.archived_at__extract_doy AS archived_at__extract_doy + , subq_6.user__ds__day AS user__ds__day + , subq_6.user__ds__week AS user__ds__week + , subq_6.user__ds__month AS user__ds__month + , subq_6.user__ds__quarter AS user__ds__quarter + , subq_6.user__ds__year AS user__ds__year + , subq_6.user__ds__extract_year AS user__ds__extract_year + , subq_6.user__ds__extract_quarter AS user__ds__extract_quarter + , subq_6.user__ds__extract_month AS user__ds__extract_month + , subq_6.user__ds__extract_day AS user__ds__extract_day + , subq_6.user__ds__extract_dow AS user__ds__extract_dow + , subq_6.user__ds__extract_doy AS user__ds__extract_doy + , subq_6.user__created_at__day AS user__created_at__day + , subq_6.user__created_at__week AS user__created_at__week + , subq_6.user__created_at__month AS user__created_at__month + , subq_6.user__created_at__quarter AS user__created_at__quarter + , subq_6.user__created_at__year AS user__created_at__year + , subq_6.user__created_at__extract_year AS user__created_at__extract_year + , subq_6.user__created_at__extract_quarter AS user__created_at__extract_quarter + , subq_6.user__created_at__extract_month AS user__created_at__extract_month + , subq_6.user__created_at__extract_day AS user__created_at__extract_day + , subq_6.user__created_at__extract_dow AS user__created_at__extract_dow + , subq_6.user__created_at__extract_doy AS user__created_at__extract_doy + , subq_6.user__ds_partitioned__day AS user__ds_partitioned__day + , subq_6.user__ds_partitioned__week AS user__ds_partitioned__week + , subq_6.user__ds_partitioned__month AS user__ds_partitioned__month + , subq_6.user__ds_partitioned__quarter AS user__ds_partitioned__quarter + , subq_6.user__ds_partitioned__year AS user__ds_partitioned__year + , subq_6.user__ds_partitioned__extract_year AS user__ds_partitioned__extract_year + , subq_6.user__ds_partitioned__extract_quarter AS user__ds_partitioned__extract_quarter + , subq_6.user__ds_partitioned__extract_month AS user__ds_partitioned__extract_month + , subq_6.user__ds_partitioned__extract_day AS user__ds_partitioned__extract_day + , subq_6.user__ds_partitioned__extract_dow AS user__ds_partitioned__extract_dow + , subq_6.user__ds_partitioned__extract_doy AS user__ds_partitioned__extract_doy + , subq_6.user__last_profile_edit_ts__millisecond AS user__last_profile_edit_ts__millisecond + , subq_6.user__last_profile_edit_ts__second AS user__last_profile_edit_ts__second + , subq_6.user__last_profile_edit_ts__minute AS user__last_profile_edit_ts__minute + , subq_6.user__last_profile_edit_ts__hour AS user__last_profile_edit_ts__hour + , subq_6.user__last_profile_edit_ts__day AS user__last_profile_edit_ts__day + , subq_6.user__last_profile_edit_ts__week AS user__last_profile_edit_ts__week + , subq_6.user__last_profile_edit_ts__month AS user__last_profile_edit_ts__month + , subq_6.user__last_profile_edit_ts__quarter AS user__last_profile_edit_ts__quarter + , subq_6.user__last_profile_edit_ts__year AS user__last_profile_edit_ts__year + , subq_6.user__last_profile_edit_ts__extract_year AS user__last_profile_edit_ts__extract_year + , subq_6.user__last_profile_edit_ts__extract_quarter AS user__last_profile_edit_ts__extract_quarter + , subq_6.user__last_profile_edit_ts__extract_month AS user__last_profile_edit_ts__extract_month + , subq_6.user__last_profile_edit_ts__extract_day AS user__last_profile_edit_ts__extract_day + , subq_6.user__last_profile_edit_ts__extract_dow AS user__last_profile_edit_ts__extract_dow + , subq_6.user__last_profile_edit_ts__extract_doy AS user__last_profile_edit_ts__extract_doy + , subq_6.user__bio_added_ts__second AS user__bio_added_ts__second + , subq_6.user__bio_added_ts__minute AS user__bio_added_ts__minute + , subq_6.user__bio_added_ts__hour AS user__bio_added_ts__hour + , subq_6.user__bio_added_ts__day AS user__bio_added_ts__day + , subq_6.user__bio_added_ts__week AS user__bio_added_ts__week + , subq_6.user__bio_added_ts__month AS user__bio_added_ts__month + , subq_6.user__bio_added_ts__quarter AS user__bio_added_ts__quarter + , subq_6.user__bio_added_ts__year AS user__bio_added_ts__year + , subq_6.user__bio_added_ts__extract_year AS user__bio_added_ts__extract_year + , subq_6.user__bio_added_ts__extract_quarter AS user__bio_added_ts__extract_quarter + , subq_6.user__bio_added_ts__extract_month AS user__bio_added_ts__extract_month + , subq_6.user__bio_added_ts__extract_day AS user__bio_added_ts__extract_day + , subq_6.user__bio_added_ts__extract_dow AS user__bio_added_ts__extract_dow + , subq_6.user__bio_added_ts__extract_doy AS user__bio_added_ts__extract_doy + , subq_6.user__last_login_ts__minute AS user__last_login_ts__minute + , subq_6.user__last_login_ts__hour AS user__last_login_ts__hour + , subq_6.user__last_login_ts__day AS user__last_login_ts__day + , subq_6.user__last_login_ts__week AS user__last_login_ts__week + , subq_6.user__last_login_ts__month AS user__last_login_ts__month + , subq_6.user__last_login_ts__quarter AS user__last_login_ts__quarter + , subq_6.user__last_login_ts__year AS user__last_login_ts__year + , subq_6.user__last_login_ts__extract_year AS user__last_login_ts__extract_year + , subq_6.user__last_login_ts__extract_quarter AS user__last_login_ts__extract_quarter + , subq_6.user__last_login_ts__extract_month AS user__last_login_ts__extract_month + , subq_6.user__last_login_ts__extract_day AS user__last_login_ts__extract_day + , subq_6.user__last_login_ts__extract_dow AS user__last_login_ts__extract_dow + , subq_6.user__last_login_ts__extract_doy AS user__last_login_ts__extract_doy + , subq_6.user__archived_at__hour AS user__archived_at__hour + , subq_6.user__archived_at__day AS user__archived_at__day + , subq_6.user__archived_at__week AS user__archived_at__week + , subq_6.user__archived_at__month AS user__archived_at__month + , subq_6.user__archived_at__quarter AS user__archived_at__quarter + , subq_6.user__archived_at__year AS user__archived_at__year + , subq_6.user__archived_at__extract_year AS user__archived_at__extract_year + , subq_6.user__archived_at__extract_quarter AS user__archived_at__extract_quarter + , subq_6.user__archived_at__extract_month AS user__archived_at__extract_month + , subq_6.user__archived_at__extract_day AS user__archived_at__extract_day + , subq_6.user__archived_at__extract_dow AS user__archived_at__extract_dow + , subq_6.user__archived_at__extract_doy AS user__archived_at__extract_doy + , subq_6.metric_time__day AS metric_time__day + , subq_6.metric_time__week AS metric_time__week + , subq_6.metric_time__month AS metric_time__month + , subq_6.metric_time__quarter AS metric_time__quarter + , subq_6.metric_time__year AS metric_time__year + , subq_6.metric_time__extract_year AS metric_time__extract_year + , subq_6.metric_time__extract_quarter AS metric_time__extract_quarter + , subq_6.metric_time__extract_month AS metric_time__extract_month + , subq_6.metric_time__extract_day AS metric_time__extract_day + , subq_6.metric_time__extract_dow AS metric_time__extract_dow + , subq_6.metric_time__extract_doy AS metric_time__extract_doy + , subq_6.user AS user + , subq_6.home_state AS home_state + , subq_6.user__home_state AS user__home_state + , subq_6.archived_users AS archived_users + FROM ( + -- Pass Only Elements: ['ts__hour', 'metric_time__hour'] + SELECT + subq_12.ts__hour + , subq_12.metric_time__hour + FROM ( + -- Apply Requested Granularities + SELECT + subq_11.ts__hour + , subq_11.ts__hour__lead AS metric_time__hour + FROM ( + -- Offset Base Granularity By Custom Granularity Period(s) + WITH cte_2 AS ( + -- Get Custom Granularity Bounds + SELECT + subq_8.ts__hour AS ts__hour + , subq_7.ds__martian_day AS ds__martian_day + , FIRST_VALUE(subq_8.ts__hour) OVER ( + PARTITION BY subq_7.ds__martian_day + ORDER BY subq_8.ts__hour + ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING + ) AS ts__hour__first_value + , LAST_VALUE(subq_8.ts__hour) OVER ( + PARTITION BY subq_7.ds__martian_day + ORDER BY subq_8.ts__hour + ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING + ) AS ts__hour__last_value + , ROW_NUMBER() OVER ( + PARTITION BY subq_7.ds__martian_day + ORDER BY subq_8.ts__hour + ) AS ts__hour__row_number + FROM ( + -- Read From Time Spine 'mf_time_spine' + SELECT + time_spine_src_28006.ds AS ds__day + , DATE_TRUNC('week', time_spine_src_28006.ds) AS ds__week + , DATE_TRUNC('month', time_spine_src_28006.ds) AS ds__month + , DATE_TRUNC('quarter', time_spine_src_28006.ds) AS ds__quarter + , DATE_TRUNC('year', time_spine_src_28006.ds) AS ds__year + , EXTRACT(year FROM time_spine_src_28006.ds) AS ds__extract_year + , EXTRACT(quarter FROM time_spine_src_28006.ds) AS ds__extract_quarter + , EXTRACT(month FROM time_spine_src_28006.ds) AS ds__extract_month + , EXTRACT(day FROM time_spine_src_28006.ds) AS ds__extract_day + , EXTRACT(DAY_OF_WEEK FROM time_spine_src_28006.ds) AS ds__extract_dow + , EXTRACT(doy FROM time_spine_src_28006.ds) AS ds__extract_doy + , time_spine_src_28006.martian_day AS ds__martian_day + FROM ***************************.mf_time_spine time_spine_src_28006 + ) subq_7 + INNER JOIN ( + -- Read From Time Spine 'mf_time_spine_hour' + SELECT + time_spine_src_28005.ts AS ts__hour + , DATE_TRUNC('day', time_spine_src_28005.ts) AS ts__day + , DATE_TRUNC('week', time_spine_src_28005.ts) AS ts__week + , DATE_TRUNC('month', time_spine_src_28005.ts) AS ts__month + , DATE_TRUNC('quarter', time_spine_src_28005.ts) AS ts__quarter + , DATE_TRUNC('year', time_spine_src_28005.ts) AS ts__year + , EXTRACT(year FROM time_spine_src_28005.ts) AS ts__extract_year + , EXTRACT(quarter FROM time_spine_src_28005.ts) AS ts__extract_quarter + , EXTRACT(month FROM time_spine_src_28005.ts) AS ts__extract_month + , EXTRACT(day FROM time_spine_src_28005.ts) AS ts__extract_day + , EXTRACT(DAY_OF_WEEK FROM time_spine_src_28005.ts) AS ts__extract_dow + , EXTRACT(doy FROM time_spine_src_28005.ts) AS ts__extract_doy + FROM ***************************.mf_time_spine_hour time_spine_src_28005 + ) subq_8 + ON + subq_7.ds__day = subq_8.ts__day + ) + + SELECT + cte_2.ts__hour AS ts__hour + , CASE + WHEN DATE_ADD('hour', (cte_2.ts__hour__row_number - 1), subq_10.ts__hour__first_value__lead) <= subq_10.ts__hour__last_value__lead + THEN DATE_ADD('hour', (cte_2.ts__hour__row_number - 1), subq_10.ts__hour__first_value__lead) + ELSE NULL + END AS ts__hour__lead + FROM cte_2 cte_2 + INNER JOIN ( + -- Offset Custom Granularity Bounds + SELECT + subq_9.ds__martian_day + , LEAD(subq_9.ts__hour__first_value, 1) OVER (ORDER BY subq_9.ds__martian_day) AS ts__hour__first_value__lead + , LEAD(subq_9.ts__hour__last_value, 1) OVER (ORDER BY subq_9.ds__martian_day) AS ts__hour__last_value__lead + FROM ( + -- Get Unique Rows for Custom Granularity Bounds + SELECT + cte_2.ds__martian_day + , cte_2.ts__hour__first_value + , cte_2.ts__hour__last_value + FROM cte_2 cte_2 + GROUP BY + cte_2.ds__martian_day + , cte_2.ts__hour__first_value + , cte_2.ts__hour__last_value + ) subq_9 + ) subq_10 + ON + cte_2.ds__martian_day = subq_10.ds__martian_day + ) subq_11 + ) subq_12 + ) subq_13 + INNER JOIN ( + -- Metric Time Dimension 'archived_at' + SELECT + subq_5.ds__day + , subq_5.ds__week + , subq_5.ds__month + , subq_5.ds__quarter + , subq_5.ds__year + , subq_5.ds__extract_year + , subq_5.ds__extract_quarter + , subq_5.ds__extract_month + , subq_5.ds__extract_day + , subq_5.ds__extract_dow + , subq_5.ds__extract_doy + , subq_5.created_at__day + , subq_5.created_at__week + , subq_5.created_at__month + , subq_5.created_at__quarter + , subq_5.created_at__year + , subq_5.created_at__extract_year + , subq_5.created_at__extract_quarter + , subq_5.created_at__extract_month + , subq_5.created_at__extract_day + , subq_5.created_at__extract_dow + , subq_5.created_at__extract_doy + , subq_5.ds_partitioned__day + , subq_5.ds_partitioned__week + , subq_5.ds_partitioned__month + , subq_5.ds_partitioned__quarter + , subq_5.ds_partitioned__year + , subq_5.ds_partitioned__extract_year + , subq_5.ds_partitioned__extract_quarter + , subq_5.ds_partitioned__extract_month + , subq_5.ds_partitioned__extract_day + , subq_5.ds_partitioned__extract_dow + , subq_5.ds_partitioned__extract_doy + , subq_5.last_profile_edit_ts__millisecond + , subq_5.last_profile_edit_ts__second + , subq_5.last_profile_edit_ts__minute + , subq_5.last_profile_edit_ts__hour + , subq_5.last_profile_edit_ts__day + , subq_5.last_profile_edit_ts__week + , subq_5.last_profile_edit_ts__month + , subq_5.last_profile_edit_ts__quarter + , subq_5.last_profile_edit_ts__year + , subq_5.last_profile_edit_ts__extract_year + , subq_5.last_profile_edit_ts__extract_quarter + , subq_5.last_profile_edit_ts__extract_month + , subq_5.last_profile_edit_ts__extract_day + , subq_5.last_profile_edit_ts__extract_dow + , subq_5.last_profile_edit_ts__extract_doy + , subq_5.bio_added_ts__second + , subq_5.bio_added_ts__minute + , subq_5.bio_added_ts__hour + , subq_5.bio_added_ts__day + , subq_5.bio_added_ts__week + , subq_5.bio_added_ts__month + , subq_5.bio_added_ts__quarter + , subq_5.bio_added_ts__year + , subq_5.bio_added_ts__extract_year + , subq_5.bio_added_ts__extract_quarter + , subq_5.bio_added_ts__extract_month + , subq_5.bio_added_ts__extract_day + , subq_5.bio_added_ts__extract_dow + , subq_5.bio_added_ts__extract_doy + , subq_5.last_login_ts__minute + , subq_5.last_login_ts__hour + , subq_5.last_login_ts__day + , subq_5.last_login_ts__week + , subq_5.last_login_ts__month + , subq_5.last_login_ts__quarter + , subq_5.last_login_ts__year + , subq_5.last_login_ts__extract_year + , subq_5.last_login_ts__extract_quarter + , subq_5.last_login_ts__extract_month + , subq_5.last_login_ts__extract_day + , subq_5.last_login_ts__extract_dow + , subq_5.last_login_ts__extract_doy + , subq_5.archived_at__hour + , subq_5.archived_at__day + , subq_5.archived_at__week + , subq_5.archived_at__month + , subq_5.archived_at__quarter + , subq_5.archived_at__year + , subq_5.archived_at__extract_year + , subq_5.archived_at__extract_quarter + , subq_5.archived_at__extract_month + , subq_5.archived_at__extract_day + , subq_5.archived_at__extract_dow + , subq_5.archived_at__extract_doy + , subq_5.user__ds__day + , subq_5.user__ds__week + , subq_5.user__ds__month + , subq_5.user__ds__quarter + , subq_5.user__ds__year + , subq_5.user__ds__extract_year + , subq_5.user__ds__extract_quarter + , subq_5.user__ds__extract_month + , subq_5.user__ds__extract_day + , subq_5.user__ds__extract_dow + , subq_5.user__ds__extract_doy + , subq_5.user__created_at__day + , subq_5.user__created_at__week + , subq_5.user__created_at__month + , subq_5.user__created_at__quarter + , subq_5.user__created_at__year + , subq_5.user__created_at__extract_year + , subq_5.user__created_at__extract_quarter + , subq_5.user__created_at__extract_month + , subq_5.user__created_at__extract_day + , subq_5.user__created_at__extract_dow + , subq_5.user__created_at__extract_doy + , subq_5.user__ds_partitioned__day + , subq_5.user__ds_partitioned__week + , subq_5.user__ds_partitioned__month + , subq_5.user__ds_partitioned__quarter + , subq_5.user__ds_partitioned__year + , subq_5.user__ds_partitioned__extract_year + , subq_5.user__ds_partitioned__extract_quarter + , subq_5.user__ds_partitioned__extract_month + , subq_5.user__ds_partitioned__extract_day + , subq_5.user__ds_partitioned__extract_dow + , subq_5.user__ds_partitioned__extract_doy + , subq_5.user__last_profile_edit_ts__millisecond + , subq_5.user__last_profile_edit_ts__second + , subq_5.user__last_profile_edit_ts__minute + , subq_5.user__last_profile_edit_ts__hour + , subq_5.user__last_profile_edit_ts__day + , subq_5.user__last_profile_edit_ts__week + , subq_5.user__last_profile_edit_ts__month + , subq_5.user__last_profile_edit_ts__quarter + , subq_5.user__last_profile_edit_ts__year + , subq_5.user__last_profile_edit_ts__extract_year + , subq_5.user__last_profile_edit_ts__extract_quarter + , subq_5.user__last_profile_edit_ts__extract_month + , subq_5.user__last_profile_edit_ts__extract_day + , subq_5.user__last_profile_edit_ts__extract_dow + , subq_5.user__last_profile_edit_ts__extract_doy + , subq_5.user__bio_added_ts__second + , subq_5.user__bio_added_ts__minute + , subq_5.user__bio_added_ts__hour + , subq_5.user__bio_added_ts__day + , subq_5.user__bio_added_ts__week + , subq_5.user__bio_added_ts__month + , subq_5.user__bio_added_ts__quarter + , subq_5.user__bio_added_ts__year + , subq_5.user__bio_added_ts__extract_year + , subq_5.user__bio_added_ts__extract_quarter + , subq_5.user__bio_added_ts__extract_month + , subq_5.user__bio_added_ts__extract_day + , subq_5.user__bio_added_ts__extract_dow + , subq_5.user__bio_added_ts__extract_doy + , subq_5.user__last_login_ts__minute + , subq_5.user__last_login_ts__hour + , subq_5.user__last_login_ts__day + , subq_5.user__last_login_ts__week + , subq_5.user__last_login_ts__month + , subq_5.user__last_login_ts__quarter + , subq_5.user__last_login_ts__year + , subq_5.user__last_login_ts__extract_year + , subq_5.user__last_login_ts__extract_quarter + , subq_5.user__last_login_ts__extract_month + , subq_5.user__last_login_ts__extract_day + , subq_5.user__last_login_ts__extract_dow + , subq_5.user__last_login_ts__extract_doy + , subq_5.user__archived_at__hour + , subq_5.user__archived_at__day + , subq_5.user__archived_at__week + , subq_5.user__archived_at__month + , subq_5.user__archived_at__quarter + , subq_5.user__archived_at__year + , subq_5.user__archived_at__extract_year + , subq_5.user__archived_at__extract_quarter + , subq_5.user__archived_at__extract_month + , subq_5.user__archived_at__extract_day + , subq_5.user__archived_at__extract_dow + , subq_5.user__archived_at__extract_doy + , subq_5.archived_at__hour AS metric_time__hour + , subq_5.archived_at__day AS metric_time__day + , subq_5.archived_at__week AS metric_time__week + , subq_5.archived_at__month AS metric_time__month + , subq_5.archived_at__quarter AS metric_time__quarter + , subq_5.archived_at__year AS metric_time__year + , subq_5.archived_at__extract_year AS metric_time__extract_year + , subq_5.archived_at__extract_quarter AS metric_time__extract_quarter + , subq_5.archived_at__extract_month AS metric_time__extract_month + , subq_5.archived_at__extract_day AS metric_time__extract_day + , subq_5.archived_at__extract_dow AS metric_time__extract_dow + , subq_5.archived_at__extract_doy AS metric_time__extract_doy + , subq_5.user + , subq_5.home_state + , subq_5.user__home_state + , subq_5.archived_users + FROM ( + -- Read Elements From Semantic Model 'users_ds_source' + SELECT + 1 AS new_users + , 1 AS archived_users + , DATE_TRUNC('day', users_ds_source_src_28000.ds) AS ds__day + , DATE_TRUNC('week', users_ds_source_src_28000.ds) AS ds__week + , DATE_TRUNC('month', users_ds_source_src_28000.ds) AS ds__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.ds) AS ds__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.ds) AS ds__year + , EXTRACT(year FROM users_ds_source_src_28000.ds) AS ds__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.ds) AS ds__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.ds) AS ds__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.ds) AS ds__extract_day + , EXTRACT(DAY_OF_WEEK FROM users_ds_source_src_28000.ds) AS ds__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.ds) AS ds__extract_doy + , DATE_TRUNC('day', users_ds_source_src_28000.created_at) AS created_at__day + , DATE_TRUNC('week', users_ds_source_src_28000.created_at) AS created_at__week + , DATE_TRUNC('month', users_ds_source_src_28000.created_at) AS created_at__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.created_at) AS created_at__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.created_at) AS created_at__year + , EXTRACT(year FROM users_ds_source_src_28000.created_at) AS created_at__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.created_at) AS created_at__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.created_at) AS created_at__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.created_at) AS created_at__extract_day + , EXTRACT(DAY_OF_WEEK FROM users_ds_source_src_28000.created_at) AS created_at__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.created_at) AS created_at__extract_doy + , DATE_TRUNC('day', users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__day + , DATE_TRUNC('week', users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__week + , DATE_TRUNC('month', users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__year + , EXTRACT(year FROM users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__extract_day + , EXTRACT(DAY_OF_WEEK FROM users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.ds_partitioned) AS ds_partitioned__extract_doy + , users_ds_source_src_28000.home_state + , DATE_TRUNC('millisecond', users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__millisecond + , DATE_TRUNC('second', users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__second + , DATE_TRUNC('minute', users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__minute + , DATE_TRUNC('hour', users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__hour + , DATE_TRUNC('day', users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__day + , DATE_TRUNC('week', users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__week + , DATE_TRUNC('month', users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__year + , EXTRACT(year FROM users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__extract_day + , EXTRACT(DAY_OF_WEEK FROM users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.last_profile_edit_ts) AS last_profile_edit_ts__extract_doy + , DATE_TRUNC('second', users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__second + , DATE_TRUNC('minute', users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__minute + , DATE_TRUNC('hour', users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__hour + , DATE_TRUNC('day', users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__day + , DATE_TRUNC('week', users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__week + , DATE_TRUNC('month', users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__year + , EXTRACT(year FROM users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__extract_day + , EXTRACT(DAY_OF_WEEK FROM users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.bio_added_ts) AS bio_added_ts__extract_doy + , DATE_TRUNC('minute', users_ds_source_src_28000.last_login_ts) AS last_login_ts__minute + , DATE_TRUNC('hour', users_ds_source_src_28000.last_login_ts) AS last_login_ts__hour + , DATE_TRUNC('day', users_ds_source_src_28000.last_login_ts) AS last_login_ts__day + , DATE_TRUNC('week', users_ds_source_src_28000.last_login_ts) AS last_login_ts__week + , DATE_TRUNC('month', users_ds_source_src_28000.last_login_ts) AS last_login_ts__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.last_login_ts) AS last_login_ts__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.last_login_ts) AS last_login_ts__year + , EXTRACT(year FROM users_ds_source_src_28000.last_login_ts) AS last_login_ts__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.last_login_ts) AS last_login_ts__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.last_login_ts) AS last_login_ts__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.last_login_ts) AS last_login_ts__extract_day + , EXTRACT(DAY_OF_WEEK FROM users_ds_source_src_28000.last_login_ts) AS last_login_ts__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.last_login_ts) AS last_login_ts__extract_doy + , DATE_TRUNC('hour', users_ds_source_src_28000.archived_at) AS archived_at__hour + , DATE_TRUNC('day', users_ds_source_src_28000.archived_at) AS archived_at__day + , DATE_TRUNC('week', users_ds_source_src_28000.archived_at) AS archived_at__week + , DATE_TRUNC('month', users_ds_source_src_28000.archived_at) AS archived_at__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.archived_at) AS archived_at__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.archived_at) AS archived_at__year + , EXTRACT(year FROM users_ds_source_src_28000.archived_at) AS archived_at__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.archived_at) AS archived_at__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.archived_at) AS archived_at__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.archived_at) AS archived_at__extract_day + , EXTRACT(DAY_OF_WEEK FROM users_ds_source_src_28000.archived_at) AS archived_at__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.archived_at) AS archived_at__extract_doy + , DATE_TRUNC('day', users_ds_source_src_28000.ds) AS user__ds__day + , DATE_TRUNC('week', users_ds_source_src_28000.ds) AS user__ds__week + , DATE_TRUNC('month', users_ds_source_src_28000.ds) AS user__ds__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.ds) AS user__ds__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.ds) AS user__ds__year + , EXTRACT(year FROM users_ds_source_src_28000.ds) AS user__ds__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.ds) AS user__ds__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.ds) AS user__ds__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.ds) AS user__ds__extract_day + , EXTRACT(DAY_OF_WEEK FROM users_ds_source_src_28000.ds) AS user__ds__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.ds) AS user__ds__extract_doy + , DATE_TRUNC('day', users_ds_source_src_28000.created_at) AS user__created_at__day + , DATE_TRUNC('week', users_ds_source_src_28000.created_at) AS user__created_at__week + , DATE_TRUNC('month', users_ds_source_src_28000.created_at) AS user__created_at__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.created_at) AS user__created_at__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.created_at) AS user__created_at__year + , EXTRACT(year FROM users_ds_source_src_28000.created_at) AS user__created_at__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.created_at) AS user__created_at__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.created_at) AS user__created_at__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.created_at) AS user__created_at__extract_day + , EXTRACT(DAY_OF_WEEK FROM users_ds_source_src_28000.created_at) AS user__created_at__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.created_at) AS user__created_at__extract_doy + , DATE_TRUNC('day', users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__day + , DATE_TRUNC('week', users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__week + , DATE_TRUNC('month', users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__year + , EXTRACT(year FROM users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__extract_day + , EXTRACT(DAY_OF_WEEK FROM users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.ds_partitioned) AS user__ds_partitioned__extract_doy + , users_ds_source_src_28000.home_state AS user__home_state + , DATE_TRUNC('millisecond', users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__millisecond + , DATE_TRUNC('second', users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__second + , DATE_TRUNC('minute', users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__minute + , DATE_TRUNC('hour', users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__hour + , DATE_TRUNC('day', users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__day + , DATE_TRUNC('week', users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__week + , DATE_TRUNC('month', users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__year + , EXTRACT(year FROM users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__extract_day + , EXTRACT(DAY_OF_WEEK FROM users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.last_profile_edit_ts) AS user__last_profile_edit_ts__extract_doy + , DATE_TRUNC('second', users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__second + , DATE_TRUNC('minute', users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__minute + , DATE_TRUNC('hour', users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__hour + , DATE_TRUNC('day', users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__day + , DATE_TRUNC('week', users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__week + , DATE_TRUNC('month', users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__year + , EXTRACT(year FROM users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__extract_day + , EXTRACT(DAY_OF_WEEK FROM users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.bio_added_ts) AS user__bio_added_ts__extract_doy + , DATE_TRUNC('minute', users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__minute + , DATE_TRUNC('hour', users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__hour + , DATE_TRUNC('day', users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__day + , DATE_TRUNC('week', users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__week + , DATE_TRUNC('month', users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__year + , EXTRACT(year FROM users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__extract_day + , EXTRACT(DAY_OF_WEEK FROM users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.last_login_ts) AS user__last_login_ts__extract_doy + , DATE_TRUNC('hour', users_ds_source_src_28000.archived_at) AS user__archived_at__hour + , DATE_TRUNC('day', users_ds_source_src_28000.archived_at) AS user__archived_at__day + , DATE_TRUNC('week', users_ds_source_src_28000.archived_at) AS user__archived_at__week + , DATE_TRUNC('month', users_ds_source_src_28000.archived_at) AS user__archived_at__month + , DATE_TRUNC('quarter', users_ds_source_src_28000.archived_at) AS user__archived_at__quarter + , DATE_TRUNC('year', users_ds_source_src_28000.archived_at) AS user__archived_at__year + , EXTRACT(year FROM users_ds_source_src_28000.archived_at) AS user__archived_at__extract_year + , EXTRACT(quarter FROM users_ds_source_src_28000.archived_at) AS user__archived_at__extract_quarter + , EXTRACT(month FROM users_ds_source_src_28000.archived_at) AS user__archived_at__extract_month + , EXTRACT(day FROM users_ds_source_src_28000.archived_at) AS user__archived_at__extract_day + , EXTRACT(DAY_OF_WEEK FROM users_ds_source_src_28000.archived_at) AS user__archived_at__extract_dow + , EXTRACT(doy FROM users_ds_source_src_28000.archived_at) AS user__archived_at__extract_doy + , users_ds_source_src_28000.user_id AS user + FROM ***************************.dim_users users_ds_source_src_28000 + ) subq_5 + ) subq_6 + ON + subq_13.ts__hour = subq_6.metric_time__hour + ) subq_14 + ) subq_15 + GROUP BY + subq_15.metric_time__hour + ) subq_16 +) subq_17 diff --git a/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Trino/test_custom_offset_window_with_multiple_time_spines__plan0_optimized.sql b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Trino/test_custom_offset_window_with_multiple_time_spines__plan0_optimized.sql new file mode 100644 index 0000000000..3ed934e808 --- /dev/null +++ b/tests_metricflow/snapshots/test_custom_granularity.py/SqlPlan/Trino/test_custom_offset_window_with_multiple_time_spines__plan0_optimized.sql @@ -0,0 +1,87 @@ +test_name: test_custom_offset_window_with_multiple_time_spines +test_filename: test_custom_granularity.py +sql_engine: Trino +--- +-- Compute Metrics via Expressions +SELECT + metric_time__hour + , archived_users AS archived_users_offset_1_martian_day +FROM ( + -- Join to Time Spine Dataset + -- Pass Only Elements: ['archived_users', 'metric_time__hour'] + -- Aggregate Measures + -- Compute Metrics via Expressions + SELECT + subq_29.ts__hour__lead AS metric_time__hour + , SUM(subq_24.archived_users) AS archived_users + FROM ( + -- Offset Base Granularity By Custom Granularity Period(s) + WITH cte_6 AS ( + -- Get Custom Granularity Bounds + SELECT + time_spine_src_28005.ts AS ts__hour + , time_spine_src_28006.martian_day AS ds__martian_day + , FIRST_VALUE(time_spine_src_28005.ts) OVER ( + PARTITION BY time_spine_src_28006.martian_day + ORDER BY time_spine_src_28005.ts + ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING + ) AS ts__hour__first_value + , LAST_VALUE(time_spine_src_28005.ts) OVER ( + PARTITION BY time_spine_src_28006.martian_day + ORDER BY time_spine_src_28005.ts + ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING + ) AS ts__hour__last_value + , ROW_NUMBER() OVER ( + PARTITION BY time_spine_src_28006.martian_day + ORDER BY time_spine_src_28005.ts + ) AS ts__hour__row_number + FROM ***************************.mf_time_spine time_spine_src_28006 + INNER JOIN + ***************************.mf_time_spine_hour time_spine_src_28005 + ON + time_spine_src_28006.ds = DATE_TRUNC('day', time_spine_src_28005.ts) + ) + + SELECT + cte_6.ts__hour AS ts__hour + , CASE + WHEN DATE_ADD('hour', (cte_6.ts__hour__row_number - 1), subq_28.ts__hour__first_value__lead) <= subq_28.ts__hour__last_value__lead + THEN DATE_ADD('hour', (cte_6.ts__hour__row_number - 1), subq_28.ts__hour__first_value__lead) + ELSE NULL + END AS ts__hour__lead + FROM cte_6 cte_6 + INNER JOIN ( + -- Offset Custom Granularity Bounds + SELECT + ds__martian_day + , LEAD(ts__hour__first_value, 1) OVER (ORDER BY ds__martian_day) AS ts__hour__first_value__lead + , LEAD(ts__hour__last_value, 1) OVER (ORDER BY ds__martian_day) AS ts__hour__last_value__lead + FROM ( + -- Get Unique Rows for Custom Granularity Bounds + SELECT + ds__martian_day + , ts__hour__first_value + , ts__hour__last_value + FROM cte_6 cte_6 + GROUP BY + ds__martian_day + , ts__hour__first_value + , ts__hour__last_value + ) subq_27 + ) subq_28 + ON + cte_6.ds__martian_day = subq_28.ds__martian_day + ) subq_29 + INNER JOIN ( + -- Read Elements From Semantic Model 'users_ds_source' + -- Metric Time Dimension 'archived_at' + SELECT + DATE_TRUNC('hour', archived_at) AS metric_time__hour + , 1 AS archived_users + FROM ***************************.dim_users users_ds_source_src_28000 + ) subq_24 + ON + subq_29.ts__hour = subq_24.metric_time__hour + GROUP BY + subq_29.ts__hour__lead +) subq_35 diff --git a/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/BigQuery/test_join_to_time_spine_with_custom_grain_in_group_by__query_output.txt b/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/BigQuery/test_join_to_time_spine_with_custom_grain_in_group_by__query_output.txt index 6f1e747281..6906a594ac 100644 --- a/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/BigQuery/test_join_to_time_spine_with_custom_grain_in_group_by__query_output.txt +++ b/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/BigQuery/test_join_to_time_spine_with_custom_grain_in_group_by__query_output.txt @@ -1,20 +1,10 @@ test_name: test_join_to_time_spine_with_custom_grain_in_group_by test_filename: test_fill_nulls_with_0.py --- -booking__ds__martian_day bookings_join_to_time_spine --------------------------- ----------------------------- -2020-01-01T00:00:00 None -2020-01-02T00:00:00 None -2020-01-03T00:00:00 None -2020-01-04T00:00:00 None -2020-01-05T00:00:00 None -2020-01-06T00:00:00 None -2020-01-07T00:00:00 None -2020-01-08T00:00:00 46 -2020-01-09T00:00:00 None -2020-01-10T00:00:00 None -2020-01-11T00:00:00 None -2020-01-12T00:00:00 None -2020-01-13T00:00:00 None -2020-01-14T00:00:00 None -2020-01-15T00:00:00 None +booking__ds__alien_day bookings_join_to_time_spine +------------------------ ----------------------------- +2020-01-01T00:00:00 None +2020-01-02T00:00:00 31 +2020-01-03T00:00:00 15 +2020-01-04T00:00:00 None +2020-01-05T00:00:00 None diff --git a/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/BigQuery/test_join_to_timespine_metric_with_custom_granularity_filter__query_output.txt b/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/BigQuery/test_join_to_timespine_metric_with_custom_granularity_filter__query_output.txt index 1363607ee0..f755f5ad45 100644 --- a/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/BigQuery/test_join_to_timespine_metric_with_custom_granularity_filter__query_output.txt +++ b/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/BigQuery/test_join_to_timespine_metric_with_custom_granularity_filter__query_output.txt @@ -1,6 +1,5 @@ test_name: test_join_to_timespine_metric_with_custom_granularity_filter test_filename: test_fill_nulls_with_0.py --- -metric_time__martian_day bookings_join_to_time_spine --------------------------- ----------------------------- -2020-01-08T00:00:00 46 +metric_time__alien_day bookings_join_to_time_spine +------------------------ ----------------------------- diff --git a/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/BigQuery/test_join_to_timespine_metric_with_custom_granularity_filter_not_in_group_by__query_output.txt b/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/BigQuery/test_join_to_timespine_metric_with_custom_granularity_filter_not_in_group_by__query_output.txt index c980e19fb0..8452166bf9 100644 --- a/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/BigQuery/test_join_to_timespine_metric_with_custom_granularity_filter_not_in_group_by__query_output.txt +++ b/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/BigQuery/test_join_to_timespine_metric_with_custom_granularity_filter_not_in_group_by__query_output.txt @@ -1,1005 +1,5 @@ test_name: test_join_to_timespine_metric_with_custom_granularity_filter_not_in_group_by test_filename: test_fill_nulls_with_0.py --- -metric_time__day bookings_join_to_time_spine -------------------- ----------------------------- -2019-03-02T00:00:00 None -2019-03-03T00:00:00 None -2019-03-04T00:00:00 None -2019-03-05T00:00:00 None -2019-03-06T00:00:00 None -2019-03-07T00:00:00 None -2019-03-08T00:00:00 None -2019-03-09T00:00:00 None -2019-03-10T00:00:00 None -2019-03-11T00:00:00 None -2019-03-12T00:00:00 None -2019-03-13T00:00:00 None -2019-03-14T00:00:00 None -2019-03-15T00:00:00 None -2019-03-16T00:00:00 None -2019-03-17T00:00:00 None -2019-03-18T00:00:00 None -2019-03-19T00:00:00 None -2019-03-20T00:00:00 None -2019-03-21T00:00:00 None -2019-03-22T00:00:00 None -2019-03-23T00:00:00 None -2019-03-24T00:00:00 None -2019-03-25T00:00:00 None -2019-03-26T00:00:00 None -2019-03-27T00:00:00 None -2019-03-28T00:00:00 None -2019-03-29T00:00:00 None -2019-03-30T00:00:00 None -2019-03-31T00:00:00 None -2019-04-01T00:00:00 None -2019-04-02T00:00:00 None -2019-04-03T00:00:00 None -2019-04-04T00:00:00 None -2019-04-05T00:00:00 None -2019-04-06T00:00:00 None -2019-04-07T00:00:00 None -2019-04-08T00:00:00 None -2019-04-09T00:00:00 None -2019-04-10T00:00:00 None -2019-04-11T00:00:00 None -2019-04-12T00:00:00 None -2019-04-13T00:00:00 None -2019-04-14T00:00:00 None -2019-04-15T00:00:00 None -2019-04-16T00:00:00 None -2019-04-17T00:00:00 None -2019-04-18T00:00:00 None -2019-04-19T00:00:00 None -2019-04-20T00:00:00 None -2019-04-21T00:00:00 None -2019-04-22T00:00:00 None -2019-04-23T00:00:00 None -2019-04-24T00:00:00 None -2019-04-25T00:00:00 None -2019-04-26T00:00:00 None -2019-04-27T00:00:00 None -2019-04-28T00:00:00 None -2019-04-29T00:00:00 None -2019-04-30T00:00:00 None -2019-05-01T00:00:00 None -2019-05-02T00:00:00 None -2019-05-03T00:00:00 None -2019-05-04T00:00:00 None -2019-05-05T00:00:00 None -2019-05-06T00:00:00 None -2019-05-07T00:00:00 None -2019-05-08T00:00:00 None -2019-05-09T00:00:00 None -2019-05-10T00:00:00 None -2019-05-11T00:00:00 None -2019-05-12T00:00:00 None -2019-05-13T00:00:00 None -2019-05-14T00:00:00 None -2019-05-15T00:00:00 None -2019-05-16T00:00:00 None -2019-05-17T00:00:00 None -2019-05-18T00:00:00 None -2019-05-19T00:00:00 None -2019-05-20T00:00:00 None -2019-05-21T00:00:00 None -2019-05-22T00:00:00 None -2019-05-23T00:00:00 None -2019-05-24T00:00:00 None -2019-05-25T00:00:00 None -2019-05-26T00:00:00 None -2019-05-27T00:00:00 None -2019-05-28T00:00:00 None -2019-05-29T00:00:00 None -2019-05-30T00:00:00 None -2019-05-31T00:00:00 None -2019-06-01T00:00:00 None -2019-06-02T00:00:00 None -2019-06-03T00:00:00 None -2019-06-04T00:00:00 None -2019-06-05T00:00:00 None -2019-06-06T00:00:00 None -2019-06-07T00:00:00 None -2019-06-08T00:00:00 None -2019-06-09T00:00:00 None -2019-06-10T00:00:00 None -2019-06-11T00:00:00 None -2019-06-12T00:00:00 None -2019-06-13T00:00:00 None -2019-06-14T00:00:00 None -2019-06-15T00:00:00 None -2019-06-16T00:00:00 None -2019-06-17T00:00:00 None -2019-06-18T00:00:00 None -2019-06-19T00:00:00 None -2019-06-20T00:00:00 None -2019-06-21T00:00:00 None -2019-06-22T00:00:00 None -2019-06-23T00:00:00 None -2019-06-24T00:00:00 None -2019-06-25T00:00:00 None -2019-06-26T00:00:00 None -2019-06-27T00:00:00 None -2019-06-28T00:00:00 None -2019-06-29T00:00:00 None -2019-06-30T00:00:00 None -2019-07-01T00:00:00 None -2019-07-02T00:00:00 None -2019-07-03T00:00:00 None -2019-07-04T00:00:00 None -2019-07-05T00:00:00 None -2019-07-06T00:00:00 None -2019-07-07T00:00:00 None -2019-07-08T00:00:00 None -2019-07-09T00:00:00 None -2019-07-10T00:00:00 None -2019-07-11T00:00:00 None -2019-07-12T00:00:00 None -2019-07-13T00:00:00 None -2019-07-14T00:00:00 None -2019-07-15T00:00:00 None -2019-07-16T00:00:00 None -2019-07-17T00:00:00 None -2019-07-18T00:00:00 None -2019-07-19T00:00:00 None -2019-07-20T00:00:00 None -2019-07-21T00:00:00 None -2019-07-22T00:00:00 None -2019-07-23T00:00:00 None -2019-07-24T00:00:00 None -2019-07-25T00:00:00 None -2019-07-26T00:00:00 None -2019-07-27T00:00:00 None -2019-07-28T00:00:00 None -2019-07-29T00:00:00 None -2019-07-30T00:00:00 None -2019-07-31T00:00:00 None -2019-08-01T00:00:00 None -2019-08-02T00:00:00 None -2019-08-03T00:00:00 None -2019-08-04T00:00:00 None -2019-08-05T00:00:00 None -2019-08-06T00:00:00 None -2019-08-07T00:00:00 None -2019-08-08T00:00:00 None -2019-08-09T00:00:00 None -2019-08-10T00:00:00 None -2019-08-11T00:00:00 None -2019-08-12T00:00:00 None -2019-08-13T00:00:00 None -2019-08-14T00:00:00 None -2019-08-15T00:00:00 None -2019-08-16T00:00:00 None -2019-08-17T00:00:00 None -2019-08-18T00:00:00 None -2019-08-19T00:00:00 None -2019-08-20T00:00:00 None -2019-08-21T00:00:00 None -2019-08-22T00:00:00 None -2019-08-23T00:00:00 None -2019-08-24T00:00:00 None -2019-08-25T00:00:00 None -2019-08-26T00:00:00 None -2019-08-27T00:00:00 None -2019-08-28T00:00:00 None -2019-08-29T00:00:00 None -2019-08-30T00:00:00 None -2019-08-31T00:00:00 None -2019-09-01T00:00:00 None -2019-09-02T00:00:00 None -2019-09-03T00:00:00 None -2019-09-04T00:00:00 None -2019-09-05T00:00:00 None -2019-09-06T00:00:00 None -2019-09-07T00:00:00 None -2019-09-08T00:00:00 None -2019-09-09T00:00:00 None -2019-09-10T00:00:00 None -2019-09-11T00:00:00 None -2019-09-12T00:00:00 None -2019-09-13T00:00:00 None -2019-09-14T00:00:00 None -2019-09-15T00:00:00 None -2019-09-16T00:00:00 None -2019-09-17T00:00:00 None -2019-09-18T00:00:00 None -2019-09-19T00:00:00 None -2019-09-20T00:00:00 None -2019-09-21T00:00:00 None -2019-09-22T00:00:00 None -2019-09-23T00:00:00 None -2019-09-24T00:00:00 None -2019-09-25T00:00:00 None -2019-09-26T00:00:00 None -2019-09-27T00:00:00 None -2019-09-28T00:00:00 None -2019-09-29T00:00:00 None -2019-09-30T00:00:00 None -2019-10-01T00:00:00 None -2019-10-02T00:00:00 None -2019-10-03T00:00:00 None -2019-10-04T00:00:00 None -2019-10-05T00:00:00 None -2019-10-06T00:00:00 None -2019-10-07T00:00:00 None -2019-10-08T00:00:00 None -2019-10-09T00:00:00 None -2019-10-10T00:00:00 None -2019-10-11T00:00:00 None -2019-10-12T00:00:00 None -2019-10-13T00:00:00 None -2019-10-14T00:00:00 None -2019-10-15T00:00:00 None -2019-10-16T00:00:00 None -2019-10-17T00:00:00 None -2019-10-18T00:00:00 None -2019-10-19T00:00:00 None -2019-10-20T00:00:00 None -2019-10-21T00:00:00 None -2019-10-22T00:00:00 None -2019-10-23T00:00:00 None -2019-10-24T00:00:00 None -2019-10-25T00:00:00 None -2019-10-26T00:00:00 None -2019-10-27T00:00:00 None -2019-10-28T00:00:00 None -2019-10-29T00:00:00 None -2019-10-30T00:00:00 None -2019-10-31T00:00:00 None -2019-11-01T00:00:00 None -2019-11-02T00:00:00 None -2019-11-03T00:00:00 None -2019-11-04T00:00:00 None -2019-11-05T00:00:00 None -2019-11-06T00:00:00 None -2019-11-07T00:00:00 None -2019-11-08T00:00:00 None -2019-11-09T00:00:00 None -2019-11-10T00:00:00 None -2019-11-11T00:00:00 None -2019-11-12T00:00:00 None -2019-11-13T00:00:00 None -2019-11-14T00:00:00 None -2019-11-15T00:00:00 None -2019-11-16T00:00:00 None -2019-11-17T00:00:00 None -2019-11-18T00:00:00 None -2019-11-19T00:00:00 None -2019-11-20T00:00:00 None -2019-11-21T00:00:00 None -2019-11-22T00:00:00 None -2019-11-23T00:00:00 None -2019-11-24T00:00:00 None -2019-11-25T00:00:00 None -2019-11-26T00:00:00 None -2019-11-27T00:00:00 None -2019-11-28T00:00:00 None -2019-11-29T00:00:00 None -2019-11-30T00:00:00 None -2019-12-01T00:00:00 1 -2019-12-02T00:00:00 None -2019-12-03T00:00:00 None -2019-12-04T00:00:00 None -2019-12-05T00:00:00 None -2019-12-06T00:00:00 None -2019-12-07T00:00:00 None -2019-12-08T00:00:00 None -2019-12-09T00:00:00 None -2019-12-10T00:00:00 None -2019-12-11T00:00:00 None -2019-12-12T00:00:00 None -2019-12-13T00:00:00 None -2019-12-14T00:00:00 None -2019-12-15T00:00:00 None -2019-12-16T00:00:00 None -2019-12-17T00:00:00 None -2019-12-18T00:00:00 10 -2019-12-19T00:00:00 18 -2019-12-20T00:00:00 2 -2019-12-21T00:00:00 None -2019-12-22T00:00:00 None -2019-12-23T00:00:00 None -2019-12-24T00:00:00 None -2019-12-25T00:00:00 None -2019-12-26T00:00:00 None -2019-12-27T00:00:00 None -2019-12-28T00:00:00 None -2019-12-29T00:00:00 None -2019-12-30T00:00:00 None -2019-12-31T00:00:00 None -2020-01-01T00:00:00 5 -2020-01-02T00:00:00 9 -2020-01-03T00:00:00 1 -2020-01-04T00:00:00 None -2020-01-05T00:00:00 None -2020-01-06T00:00:00 None -2020-01-07T00:00:00 None -2020-01-08T00:00:00 None -2020-01-09T00:00:00 None -2020-01-10T00:00:00 None -2020-01-11T00:00:00 None -2020-01-12T00:00:00 None -2020-01-13T00:00:00 None -2020-01-14T00:00:00 None -2020-01-15T00:00:00 None -2020-01-16T00:00:00 None -2020-01-17T00:00:00 None -2020-01-18T00:00:00 None -2020-01-19T00:00:00 None -2020-01-20T00:00:00 None -2020-01-21T00:00:00 None -2020-01-22T00:00:00 None -2020-01-23T00:00:00 None -2020-01-24T00:00:00 None -2020-01-25T00:00:00 None -2020-01-26T00:00:00 None -2020-01-27T00:00:00 None -2020-01-28T00:00:00 None -2020-01-29T00:00:00 None -2020-01-30T00:00:00 None -2020-01-31T00:00:00 None -2020-02-01T00:00:00 None -2020-02-02T00:00:00 None -2020-02-03T00:00:00 None -2020-02-04T00:00:00 None -2020-02-05T00:00:00 None -2020-02-06T00:00:00 None -2020-02-07T00:00:00 None -2020-02-08T00:00:00 None -2020-02-09T00:00:00 None -2020-02-10T00:00:00 None -2020-02-11T00:00:00 None -2020-02-12T00:00:00 None -2020-02-13T00:00:00 None -2020-02-14T00:00:00 None -2020-02-15T00:00:00 None -2020-02-16T00:00:00 None -2020-02-17T00:00:00 None -2020-02-18T00:00:00 None -2020-02-19T00:00:00 None -2020-02-20T00:00:00 None -2020-02-21T00:00:00 None -2020-02-22T00:00:00 None -2020-02-23T00:00:00 None -2020-02-24T00:00:00 None -2020-02-25T00:00:00 None -2020-02-26T00:00:00 None -2020-02-27T00:00:00 None -2020-02-28T00:00:00 None -2020-02-29T00:00:00 None -2020-03-01T00:00:00 None -2020-03-02T00:00:00 None -2020-03-03T00:00:00 None -2020-03-04T00:00:00 None -2020-03-05T00:00:00 None -2020-03-06T00:00:00 None -2020-03-07T00:00:00 None -2020-03-08T00:00:00 None -2020-03-09T00:00:00 None -2020-03-10T00:00:00 None -2020-03-11T00:00:00 None -2020-03-12T00:00:00 None -2020-03-13T00:00:00 None -2020-03-14T00:00:00 None -2020-03-15T00:00:00 None -2020-03-16T00:00:00 None -2020-03-17T00:00:00 None -2020-03-18T00:00:00 None -2020-03-19T00:00:00 None -2020-03-20T00:00:00 None -2020-03-21T00:00:00 None -2020-03-22T00:00:00 None -2020-03-23T00:00:00 None -2020-03-24T00:00:00 None -2020-03-25T00:00:00 None -2020-03-26T00:00:00 None -2020-03-27T00:00:00 None -2020-03-28T00:00:00 None -2020-03-29T00:00:00 None -2020-03-30T00:00:00 None -2020-03-31T00:00:00 None -2020-04-01T00:00:00 None -2020-04-02T00:00:00 None -2020-04-03T00:00:00 None -2020-04-04T00:00:00 None -2020-04-05T00:00:00 None -2020-04-06T00:00:00 None -2020-04-07T00:00:00 None -2020-04-08T00:00:00 None -2020-04-09T00:00:00 None -2020-04-10T00:00:00 None -2020-04-11T00:00:00 None -2020-04-12T00:00:00 None -2020-04-13T00:00:00 None -2020-04-14T00:00:00 None -2020-04-15T00:00:00 None -2020-04-16T00:00:00 None -2020-04-17T00:00:00 None -2020-04-18T00:00:00 None -2020-04-19T00:00:00 None -2020-04-20T00:00:00 None -2020-04-21T00:00:00 None -2020-04-22T00:00:00 None -2020-04-23T00:00:00 None -2020-04-24T00:00:00 None -2020-04-25T00:00:00 None -2020-04-26T00:00:00 None -2020-04-27T00:00:00 None -2020-04-28T00:00:00 None -2020-04-29T00:00:00 None -2020-04-30T00:00:00 None -2020-05-01T00:00:00 None -2020-05-02T00:00:00 None -2020-05-03T00:00:00 None -2020-05-04T00:00:00 None -2020-05-05T00:00:00 None -2020-05-06T00:00:00 None -2020-05-07T00:00:00 None -2020-05-08T00:00:00 None -2020-05-09T00:00:00 None -2020-05-10T00:00:00 None -2020-05-11T00:00:00 None -2020-05-12T00:00:00 None -2020-05-13T00:00:00 None -2020-05-14T00:00:00 None -2020-05-15T00:00:00 None -2020-05-16T00:00:00 None -2020-05-17T00:00:00 None -2020-05-18T00:00:00 None -2020-05-19T00:00:00 None -2020-05-20T00:00:00 None -2020-05-21T00:00:00 None -2020-05-22T00:00:00 None -2020-05-23T00:00:00 None -2020-05-24T00:00:00 None -2020-05-25T00:00:00 None -2020-05-26T00:00:00 None -2020-05-27T00:00:00 None -2020-05-28T00:00:00 None -2020-05-29T00:00:00 None -2020-05-30T00:00:00 None -2020-05-31T00:00:00 None -2020-06-01T00:00:00 None -2020-06-02T00:00:00 None -2020-06-03T00:00:00 None -2020-06-04T00:00:00 None -2020-06-05T00:00:00 None -2020-06-06T00:00:00 None -2020-06-07T00:00:00 None -2020-06-08T00:00:00 None -2020-06-09T00:00:00 None -2020-06-10T00:00:00 None -2020-06-11T00:00:00 None -2020-06-12T00:00:00 None -2020-06-13T00:00:00 None -2020-06-14T00:00:00 None -2020-06-15T00:00:00 None -2020-06-16T00:00:00 None -2020-06-17T00:00:00 None -2020-06-18T00:00:00 None -2020-06-19T00:00:00 None -2020-06-20T00:00:00 None -2020-06-21T00:00:00 None -2020-06-22T00:00:00 None -2020-06-23T00:00:00 None -2020-06-24T00:00:00 None -2020-06-25T00:00:00 None -2020-06-26T00:00:00 None -2020-06-27T00:00:00 None -2020-06-28T00:00:00 None -2020-06-29T00:00:00 None -2020-06-30T00:00:00 None -2020-07-01T00:00:00 None -2020-07-02T00:00:00 None -2020-07-03T00:00:00 None -2020-07-04T00:00:00 None -2020-07-05T00:00:00 None -2020-07-06T00:00:00 None -2020-07-07T00:00:00 None -2020-07-08T00:00:00 None -2020-07-09T00:00:00 None -2020-07-10T00:00:00 None -2020-07-11T00:00:00 None -2020-07-12T00:00:00 None -2020-07-13T00:00:00 None -2020-07-14T00:00:00 None -2020-07-15T00:00:00 None -2020-07-16T00:00:00 None -2020-07-17T00:00:00 None -2020-07-18T00:00:00 None -2020-07-19T00:00:00 None -2020-07-20T00:00:00 None -2020-07-21T00:00:00 None -2020-07-22T00:00:00 None -2020-07-23T00:00:00 None -2020-07-24T00:00:00 None -2020-07-25T00:00:00 None -2020-07-26T00:00:00 None -2020-07-27T00:00:00 None -2020-07-28T00:00:00 None -2020-07-29T00:00:00 None -2020-07-30T00:00:00 None -2020-07-31T00:00:00 None -2020-08-01T00:00:00 None -2020-08-02T00:00:00 None -2020-08-03T00:00:00 None -2020-08-04T00:00:00 None -2020-08-05T00:00:00 None -2020-08-06T00:00:00 None -2020-08-07T00:00:00 None -2020-08-08T00:00:00 None -2020-08-09T00:00:00 None -2020-08-10T00:00:00 None -2020-08-11T00:00:00 None -2020-08-12T00:00:00 None -2020-08-13T00:00:00 None -2020-08-14T00:00:00 None -2020-08-15T00:00:00 None -2020-08-16T00:00:00 None -2020-08-17T00:00:00 None -2020-08-18T00:00:00 None -2020-08-19T00:00:00 None -2020-08-20T00:00:00 None -2020-08-21T00:00:00 None -2020-08-22T00:00:00 None -2020-08-23T00:00:00 None -2020-08-24T00:00:00 None -2020-08-25T00:00:00 None -2020-08-26T00:00:00 None -2020-08-27T00:00:00 None -2020-08-28T00:00:00 None -2020-08-29T00:00:00 None -2020-08-30T00:00:00 None -2020-08-31T00:00:00 None -2020-09-01T00:00:00 None -2020-09-02T00:00:00 None -2020-09-03T00:00:00 None -2020-09-04T00:00:00 None -2020-09-05T00:00:00 None -2020-09-06T00:00:00 None -2020-09-07T00:00:00 None -2020-09-08T00:00:00 None -2020-09-09T00:00:00 None -2020-09-10T00:00:00 None -2020-09-11T00:00:00 None -2020-09-12T00:00:00 None -2020-09-13T00:00:00 None -2020-09-14T00:00:00 None -2020-09-15T00:00:00 None -2020-09-16T00:00:00 None -2020-09-17T00:00:00 None -2020-09-18T00:00:00 None -2020-09-19T00:00:00 None -2020-09-20T00:00:00 None -2020-09-21T00:00:00 None -2020-09-22T00:00:00 None -2020-09-23T00:00:00 None -2020-09-24T00:00:00 None -2020-09-25T00:00:00 None -2020-09-26T00:00:00 None -2020-09-27T00:00:00 None -2020-09-28T00:00:00 None -2020-09-29T00:00:00 None -2020-09-30T00:00:00 None -2020-10-01T00:00:00 None -2020-10-02T00:00:00 None -2020-10-03T00:00:00 None -2020-10-04T00:00:00 None -2020-10-05T00:00:00 None -2020-10-06T00:00:00 None -2020-10-07T00:00:00 None -2020-10-08T00:00:00 None -2020-10-09T00:00:00 None -2020-10-10T00:00:00 None -2020-10-11T00:00:00 None -2020-10-12T00:00:00 None -2020-10-13T00:00:00 None -2020-10-14T00:00:00 None -2020-10-15T00:00:00 None -2020-10-16T00:00:00 None -2020-10-17T00:00:00 None -2020-10-18T00:00:00 None -2020-10-19T00:00:00 None -2020-10-20T00:00:00 None -2020-10-21T00:00:00 None -2020-10-22T00:00:00 None -2020-10-23T00:00:00 None -2020-10-24T00:00:00 None -2020-10-25T00:00:00 None -2020-10-26T00:00:00 None -2020-10-27T00:00:00 None -2020-10-28T00:00:00 None -2020-10-29T00:00:00 None -2020-10-30T00:00:00 None -2020-10-31T00:00:00 None -2020-11-01T00:00:00 None -2020-11-02T00:00:00 None -2020-11-03T00:00:00 None -2020-11-04T00:00:00 None -2020-11-05T00:00:00 None -2020-11-06T00:00:00 None -2020-11-07T00:00:00 None -2020-11-08T00:00:00 None -2020-11-09T00:00:00 None -2020-11-10T00:00:00 None -2020-11-11T00:00:00 None -2020-11-12T00:00:00 None -2020-11-13T00:00:00 None -2020-11-14T00:00:00 None -2020-11-15T00:00:00 None -2020-11-16T00:00:00 None -2020-11-17T00:00:00 None -2020-11-18T00:00:00 None -2020-11-19T00:00:00 None -2020-11-20T00:00:00 None -2020-11-21T00:00:00 None -2020-11-22T00:00:00 None -2020-11-23T00:00:00 None -2020-11-24T00:00:00 None -2020-11-25T00:00:00 None -2020-11-26T00:00:00 None -2020-11-27T00:00:00 None -2020-11-28T00:00:00 None -2020-11-29T00:00:00 None -2020-11-30T00:00:00 None -2020-12-01T00:00:00 None -2020-12-02T00:00:00 None -2020-12-03T00:00:00 None -2020-12-04T00:00:00 None -2020-12-05T00:00:00 None -2020-12-06T00:00:00 None -2020-12-07T00:00:00 None -2020-12-08T00:00:00 None -2020-12-09T00:00:00 None -2020-12-10T00:00:00 None -2020-12-11T00:00:00 None -2020-12-12T00:00:00 None -2020-12-13T00:00:00 None -2020-12-14T00:00:00 None -2020-12-15T00:00:00 None -2020-12-16T00:00:00 None -2020-12-17T00:00:00 None -2020-12-18T00:00:00 None -2020-12-19T00:00:00 None -2020-12-20T00:00:00 None -2020-12-21T00:00:00 None -2020-12-22T00:00:00 None -2020-12-23T00:00:00 None -2020-12-24T00:00:00 None -2020-12-25T00:00:00 None -2020-12-26T00:00:00 None -2020-12-27T00:00:00 None -2020-12-28T00:00:00 None -2020-12-29T00:00:00 None -2020-12-30T00:00:00 None -2020-12-31T00:00:00 None -2021-01-01T00:00:00 None -2021-01-02T00:00:00 None -2021-01-03T00:00:00 None -2021-01-04T00:00:00 None -2021-01-05T00:00:00 None -2021-01-06T00:00:00 None -2021-01-07T00:00:00 None -2021-01-08T00:00:00 None -2021-01-09T00:00:00 None -2021-01-10T00:00:00 None -2021-01-11T00:00:00 None -2021-01-12T00:00:00 None -2021-01-13T00:00:00 None -2021-01-14T00:00:00 None -2021-01-15T00:00:00 None -2021-01-16T00:00:00 None -2021-01-17T00:00:00 None -2021-01-18T00:00:00 None -2021-01-19T00:00:00 None -2021-01-20T00:00:00 None -2021-01-21T00:00:00 None -2021-01-22T00:00:00 None -2021-01-23T00:00:00 None -2021-01-24T00:00:00 None -2021-01-25T00:00:00 None -2021-01-26T00:00:00 None -2021-01-27T00:00:00 None -2021-01-28T00:00:00 None -2021-01-29T00:00:00 None -2021-01-30T00:00:00 None -2021-01-31T00:00:00 None -2021-02-01T00:00:00 None -2021-02-02T00:00:00 None -2021-02-03T00:00:00 None -2021-02-04T00:00:00 None -2021-02-05T00:00:00 None -2021-02-06T00:00:00 None -2021-02-07T00:00:00 None -2021-02-08T00:00:00 None -2021-02-09T00:00:00 None -2021-02-10T00:00:00 None -2021-02-11T00:00:00 None -2021-02-12T00:00:00 None -2021-02-13T00:00:00 None -2021-02-14T00:00:00 None -2021-02-15T00:00:00 None -2021-02-16T00:00:00 None -2021-02-17T00:00:00 None -2021-02-18T00:00:00 None -2021-02-19T00:00:00 None -2021-02-20T00:00:00 None -2021-02-21T00:00:00 None -2021-02-22T00:00:00 None -2021-02-23T00:00:00 None -2021-02-24T00:00:00 None -2021-02-25T00:00:00 None -2021-02-26T00:00:00 None -2021-02-27T00:00:00 None -2021-02-28T00:00:00 None -2021-03-01T00:00:00 None -2021-03-02T00:00:00 None -2021-03-03T00:00:00 None -2021-03-04T00:00:00 None -2021-03-05T00:00:00 None -2021-03-06T00:00:00 None -2021-03-07T00:00:00 None -2021-03-08T00:00:00 None -2021-03-09T00:00:00 None -2021-03-10T00:00:00 None -2021-03-11T00:00:00 None -2021-03-12T00:00:00 None -2021-03-13T00:00:00 None -2021-03-14T00:00:00 None -2021-03-15T00:00:00 None -2021-03-16T00:00:00 None -2021-03-17T00:00:00 None -2021-03-18T00:00:00 None -2021-03-19T00:00:00 None -2021-03-20T00:00:00 None -2021-03-21T00:00:00 None -2021-03-22T00:00:00 None -2021-03-23T00:00:00 None -2021-03-24T00:00:00 None -2021-03-25T00:00:00 None -2021-03-26T00:00:00 None -2021-03-27T00:00:00 None -2021-03-28T00:00:00 None -2021-03-29T00:00:00 None -2021-03-30T00:00:00 None -2021-03-31T00:00:00 None -2021-04-01T00:00:00 None -2021-04-02T00:00:00 None -2021-04-03T00:00:00 None -2021-04-04T00:00:00 None -2021-04-05T00:00:00 None -2021-04-06T00:00:00 None -2021-04-07T00:00:00 None -2021-04-08T00:00:00 None -2021-04-09T00:00:00 None -2021-04-10T00:00:00 None -2021-04-11T00:00:00 None -2021-04-12T00:00:00 None -2021-04-13T00:00:00 None -2021-04-14T00:00:00 None -2021-04-15T00:00:00 None -2021-04-16T00:00:00 None -2021-04-17T00:00:00 None -2021-04-18T00:00:00 None -2021-04-19T00:00:00 None -2021-04-20T00:00:00 None -2021-04-21T00:00:00 None -2021-04-22T00:00:00 None -2021-04-23T00:00:00 None -2021-04-24T00:00:00 None -2021-04-25T00:00:00 None -2021-04-26T00:00:00 None -2021-04-27T00:00:00 None -2021-04-28T00:00:00 None -2021-04-29T00:00:00 None -2021-04-30T00:00:00 None -2021-05-01T00:00:00 None -2021-05-02T00:00:00 None -2021-05-03T00:00:00 None -2021-05-04T00:00:00 None -2021-05-05T00:00:00 None -2021-05-06T00:00:00 None -2021-05-07T00:00:00 None -2021-05-08T00:00:00 None -2021-05-09T00:00:00 None -2021-05-10T00:00:00 None -2021-05-11T00:00:00 None -2021-05-12T00:00:00 None -2021-05-13T00:00:00 None -2021-05-14T00:00:00 None -2021-05-15T00:00:00 None -2021-05-16T00:00:00 None -2021-05-17T00:00:00 None -2021-05-18T00:00:00 None -2021-05-19T00:00:00 None -2021-05-20T00:00:00 None -2021-05-21T00:00:00 None -2021-05-22T00:00:00 None -2021-05-23T00:00:00 None -2021-05-24T00:00:00 None -2021-05-25T00:00:00 None -2021-05-26T00:00:00 None -2021-05-27T00:00:00 None -2021-05-28T00:00:00 None -2021-05-29T00:00:00 None -2021-05-30T00:00:00 None -2021-05-31T00:00:00 None -2021-06-01T00:00:00 None -2021-06-02T00:00:00 None -2021-06-03T00:00:00 None -2021-06-04T00:00:00 None -2021-06-05T00:00:00 None -2021-06-06T00:00:00 None -2021-06-07T00:00:00 None -2021-06-08T00:00:00 None -2021-06-09T00:00:00 None -2021-06-10T00:00:00 None -2021-06-11T00:00:00 None -2021-06-12T00:00:00 None -2021-06-13T00:00:00 None -2021-06-14T00:00:00 None -2021-06-15T00:00:00 None -2021-06-16T00:00:00 None -2021-06-17T00:00:00 None -2021-06-18T00:00:00 None -2021-06-19T00:00:00 None -2021-06-20T00:00:00 None -2021-06-21T00:00:00 None -2021-06-22T00:00:00 None -2021-06-23T00:00:00 None -2021-06-24T00:00:00 None -2021-06-25T00:00:00 None -2021-06-26T00:00:00 None -2021-06-27T00:00:00 None -2021-06-28T00:00:00 None -2021-06-29T00:00:00 None -2021-06-30T00:00:00 None -2021-07-01T00:00:00 None -2021-07-02T00:00:00 None -2021-07-03T00:00:00 None -2021-07-04T00:00:00 None -2021-07-05T00:00:00 None -2021-07-06T00:00:00 None -2021-07-07T00:00:00 None -2021-07-08T00:00:00 None -2021-07-09T00:00:00 None -2021-07-10T00:00:00 None -2021-07-11T00:00:00 None -2021-07-12T00:00:00 None -2021-07-13T00:00:00 None -2021-07-14T00:00:00 None -2021-07-15T00:00:00 None -2021-07-16T00:00:00 None -2021-07-17T00:00:00 None -2021-07-18T00:00:00 None -2021-07-19T00:00:00 None -2021-07-20T00:00:00 None -2021-07-21T00:00:00 None -2021-07-22T00:00:00 None -2021-07-23T00:00:00 None -2021-07-24T00:00:00 None -2021-07-25T00:00:00 None -2021-07-26T00:00:00 None -2021-07-27T00:00:00 None -2021-07-28T00:00:00 None -2021-07-29T00:00:00 None -2021-07-30T00:00:00 None -2021-07-31T00:00:00 None -2021-08-01T00:00:00 None -2021-08-02T00:00:00 None -2021-08-03T00:00:00 None -2021-08-04T00:00:00 None -2021-08-05T00:00:00 None -2021-08-06T00:00:00 None -2021-08-07T00:00:00 None -2021-08-08T00:00:00 None -2021-08-09T00:00:00 None -2021-08-10T00:00:00 None -2021-08-11T00:00:00 None -2021-08-12T00:00:00 None -2021-08-13T00:00:00 None -2021-08-14T00:00:00 None -2021-08-15T00:00:00 None -2021-08-16T00:00:00 None -2021-08-17T00:00:00 None -2021-08-18T00:00:00 None -2021-08-19T00:00:00 None -2021-08-20T00:00:00 None -2021-08-21T00:00:00 None -2021-08-22T00:00:00 None -2021-08-23T00:00:00 None -2021-08-24T00:00:00 None -2021-08-25T00:00:00 None -2021-08-26T00:00:00 None -2021-08-27T00:00:00 None -2021-08-28T00:00:00 None -2021-08-29T00:00:00 None -2021-08-30T00:00:00 None -2021-08-31T00:00:00 None -2021-09-01T00:00:00 None -2021-09-02T00:00:00 None -2021-09-03T00:00:00 None -2021-09-04T00:00:00 None -2021-09-05T00:00:00 None -2021-09-06T00:00:00 None -2021-09-07T00:00:00 None -2021-09-08T00:00:00 None -2021-09-09T00:00:00 None -2021-09-10T00:00:00 None -2021-09-11T00:00:00 None -2021-09-12T00:00:00 None -2021-09-13T00:00:00 None -2021-09-14T00:00:00 None -2021-09-15T00:00:00 None -2021-09-16T00:00:00 None -2021-09-17T00:00:00 None -2021-09-18T00:00:00 None -2021-09-19T00:00:00 None -2021-09-20T00:00:00 None -2021-09-21T00:00:00 None -2021-09-22T00:00:00 None -2021-09-23T00:00:00 None -2021-09-24T00:00:00 None -2021-09-25T00:00:00 None -2021-09-26T00:00:00 None -2021-09-27T00:00:00 None -2021-09-28T00:00:00 None -2021-09-29T00:00:00 None -2021-09-30T00:00:00 None -2021-10-01T00:00:00 None -2021-10-02T00:00:00 None -2021-10-03T00:00:00 None -2021-10-04T00:00:00 None -2021-10-05T00:00:00 None -2021-10-06T00:00:00 None -2021-10-07T00:00:00 None -2021-10-08T00:00:00 None -2021-10-09T00:00:00 None -2021-10-10T00:00:00 None -2021-10-11T00:00:00 None -2021-10-12T00:00:00 None -2021-10-13T00:00:00 None -2021-10-14T00:00:00 None -2021-10-15T00:00:00 None -2021-10-16T00:00:00 None -2021-10-17T00:00:00 None -2021-10-18T00:00:00 None -2021-10-19T00:00:00 None -2021-10-20T00:00:00 None -2021-10-21T00:00:00 None -2021-10-22T00:00:00 None -2021-10-23T00:00:00 None -2021-10-24T00:00:00 None -2021-10-25T00:00:00 None -2021-10-26T00:00:00 None -2021-10-27T00:00:00 None -2021-10-28T00:00:00 None -2021-10-29T00:00:00 None -2021-10-30T00:00:00 None -2021-10-31T00:00:00 None -2021-11-01T00:00:00 None -2021-11-02T00:00:00 None -2021-11-03T00:00:00 None -2021-11-04T00:00:00 None -2021-11-05T00:00:00 None -2021-11-06T00:00:00 None -2021-11-07T00:00:00 None -2021-11-08T00:00:00 None -2021-11-09T00:00:00 None -2021-11-10T00:00:00 None -2021-11-11T00:00:00 None -2021-11-12T00:00:00 None -2021-11-13T00:00:00 None -2021-11-14T00:00:00 None -2021-11-15T00:00:00 None -2021-11-16T00:00:00 None -2021-11-17T00:00:00 None -2021-11-18T00:00:00 None -2021-11-19T00:00:00 None -2021-11-20T00:00:00 None -2021-11-21T00:00:00 None -2021-11-22T00:00:00 None -2021-11-23T00:00:00 None -2021-11-24T00:00:00 None -2021-11-25T00:00:00 None +metric_time__day bookings_join_to_time_spine +------------------ ----------------------------- diff --git a/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Databricks/test_join_to_time_spine_with_custom_grain_in_group_by__query_output.txt b/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Databricks/test_join_to_time_spine_with_custom_grain_in_group_by__query_output.txt index 6f1e747281..6906a594ac 100644 --- a/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Databricks/test_join_to_time_spine_with_custom_grain_in_group_by__query_output.txt +++ b/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Databricks/test_join_to_time_spine_with_custom_grain_in_group_by__query_output.txt @@ -1,20 +1,10 @@ test_name: test_join_to_time_spine_with_custom_grain_in_group_by test_filename: test_fill_nulls_with_0.py --- -booking__ds__martian_day bookings_join_to_time_spine --------------------------- ----------------------------- -2020-01-01T00:00:00 None -2020-01-02T00:00:00 None -2020-01-03T00:00:00 None -2020-01-04T00:00:00 None -2020-01-05T00:00:00 None -2020-01-06T00:00:00 None -2020-01-07T00:00:00 None -2020-01-08T00:00:00 46 -2020-01-09T00:00:00 None -2020-01-10T00:00:00 None -2020-01-11T00:00:00 None -2020-01-12T00:00:00 None -2020-01-13T00:00:00 None -2020-01-14T00:00:00 None -2020-01-15T00:00:00 None +booking__ds__alien_day bookings_join_to_time_spine +------------------------ ----------------------------- +2020-01-01T00:00:00 None +2020-01-02T00:00:00 31 +2020-01-03T00:00:00 15 +2020-01-04T00:00:00 None +2020-01-05T00:00:00 None diff --git a/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Databricks/test_join_to_timespine_metric_with_custom_granularity_filter__query_output.txt b/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Databricks/test_join_to_timespine_metric_with_custom_granularity_filter__query_output.txt index 1363607ee0..f755f5ad45 100644 --- a/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Databricks/test_join_to_timespine_metric_with_custom_granularity_filter__query_output.txt +++ b/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Databricks/test_join_to_timespine_metric_with_custom_granularity_filter__query_output.txt @@ -1,6 +1,5 @@ test_name: test_join_to_timespine_metric_with_custom_granularity_filter test_filename: test_fill_nulls_with_0.py --- -metric_time__martian_day bookings_join_to_time_spine --------------------------- ----------------------------- -2020-01-08T00:00:00 46 +metric_time__alien_day bookings_join_to_time_spine +------------------------ ----------------------------- diff --git a/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Databricks/test_join_to_timespine_metric_with_custom_granularity_filter_not_in_group_by__query_output.txt b/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Databricks/test_join_to_timespine_metric_with_custom_granularity_filter_not_in_group_by__query_output.txt index c980e19fb0..8452166bf9 100644 --- a/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Databricks/test_join_to_timespine_metric_with_custom_granularity_filter_not_in_group_by__query_output.txt +++ b/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Databricks/test_join_to_timespine_metric_with_custom_granularity_filter_not_in_group_by__query_output.txt @@ -1,1005 +1,5 @@ test_name: test_join_to_timespine_metric_with_custom_granularity_filter_not_in_group_by test_filename: test_fill_nulls_with_0.py --- -metric_time__day bookings_join_to_time_spine -------------------- ----------------------------- -2019-03-02T00:00:00 None -2019-03-03T00:00:00 None -2019-03-04T00:00:00 None -2019-03-05T00:00:00 None -2019-03-06T00:00:00 None -2019-03-07T00:00:00 None -2019-03-08T00:00:00 None -2019-03-09T00:00:00 None -2019-03-10T00:00:00 None -2019-03-11T00:00:00 None -2019-03-12T00:00:00 None -2019-03-13T00:00:00 None -2019-03-14T00:00:00 None -2019-03-15T00:00:00 None -2019-03-16T00:00:00 None -2019-03-17T00:00:00 None -2019-03-18T00:00:00 None -2019-03-19T00:00:00 None -2019-03-20T00:00:00 None -2019-03-21T00:00:00 None -2019-03-22T00:00:00 None -2019-03-23T00:00:00 None -2019-03-24T00:00:00 None -2019-03-25T00:00:00 None -2019-03-26T00:00:00 None -2019-03-27T00:00:00 None -2019-03-28T00:00:00 None -2019-03-29T00:00:00 None -2019-03-30T00:00:00 None -2019-03-31T00:00:00 None -2019-04-01T00:00:00 None -2019-04-02T00:00:00 None -2019-04-03T00:00:00 None -2019-04-04T00:00:00 None -2019-04-05T00:00:00 None -2019-04-06T00:00:00 None -2019-04-07T00:00:00 None -2019-04-08T00:00:00 None -2019-04-09T00:00:00 None -2019-04-10T00:00:00 None -2019-04-11T00:00:00 None -2019-04-12T00:00:00 None -2019-04-13T00:00:00 None -2019-04-14T00:00:00 None -2019-04-15T00:00:00 None -2019-04-16T00:00:00 None -2019-04-17T00:00:00 None -2019-04-18T00:00:00 None -2019-04-19T00:00:00 None -2019-04-20T00:00:00 None -2019-04-21T00:00:00 None -2019-04-22T00:00:00 None -2019-04-23T00:00:00 None -2019-04-24T00:00:00 None -2019-04-25T00:00:00 None -2019-04-26T00:00:00 None -2019-04-27T00:00:00 None -2019-04-28T00:00:00 None -2019-04-29T00:00:00 None -2019-04-30T00:00:00 None -2019-05-01T00:00:00 None -2019-05-02T00:00:00 None -2019-05-03T00:00:00 None -2019-05-04T00:00:00 None -2019-05-05T00:00:00 None -2019-05-06T00:00:00 None -2019-05-07T00:00:00 None -2019-05-08T00:00:00 None -2019-05-09T00:00:00 None -2019-05-10T00:00:00 None -2019-05-11T00:00:00 None -2019-05-12T00:00:00 None -2019-05-13T00:00:00 None -2019-05-14T00:00:00 None -2019-05-15T00:00:00 None -2019-05-16T00:00:00 None -2019-05-17T00:00:00 None -2019-05-18T00:00:00 None -2019-05-19T00:00:00 None -2019-05-20T00:00:00 None -2019-05-21T00:00:00 None -2019-05-22T00:00:00 None -2019-05-23T00:00:00 None -2019-05-24T00:00:00 None -2019-05-25T00:00:00 None -2019-05-26T00:00:00 None -2019-05-27T00:00:00 None -2019-05-28T00:00:00 None -2019-05-29T00:00:00 None -2019-05-30T00:00:00 None -2019-05-31T00:00:00 None -2019-06-01T00:00:00 None -2019-06-02T00:00:00 None -2019-06-03T00:00:00 None -2019-06-04T00:00:00 None -2019-06-05T00:00:00 None -2019-06-06T00:00:00 None -2019-06-07T00:00:00 None -2019-06-08T00:00:00 None -2019-06-09T00:00:00 None -2019-06-10T00:00:00 None -2019-06-11T00:00:00 None -2019-06-12T00:00:00 None -2019-06-13T00:00:00 None -2019-06-14T00:00:00 None -2019-06-15T00:00:00 None -2019-06-16T00:00:00 None -2019-06-17T00:00:00 None -2019-06-18T00:00:00 None -2019-06-19T00:00:00 None -2019-06-20T00:00:00 None -2019-06-21T00:00:00 None -2019-06-22T00:00:00 None -2019-06-23T00:00:00 None -2019-06-24T00:00:00 None -2019-06-25T00:00:00 None -2019-06-26T00:00:00 None -2019-06-27T00:00:00 None -2019-06-28T00:00:00 None -2019-06-29T00:00:00 None -2019-06-30T00:00:00 None -2019-07-01T00:00:00 None -2019-07-02T00:00:00 None -2019-07-03T00:00:00 None -2019-07-04T00:00:00 None -2019-07-05T00:00:00 None -2019-07-06T00:00:00 None -2019-07-07T00:00:00 None -2019-07-08T00:00:00 None -2019-07-09T00:00:00 None -2019-07-10T00:00:00 None -2019-07-11T00:00:00 None -2019-07-12T00:00:00 None -2019-07-13T00:00:00 None -2019-07-14T00:00:00 None -2019-07-15T00:00:00 None -2019-07-16T00:00:00 None -2019-07-17T00:00:00 None -2019-07-18T00:00:00 None -2019-07-19T00:00:00 None -2019-07-20T00:00:00 None -2019-07-21T00:00:00 None -2019-07-22T00:00:00 None -2019-07-23T00:00:00 None -2019-07-24T00:00:00 None -2019-07-25T00:00:00 None -2019-07-26T00:00:00 None -2019-07-27T00:00:00 None -2019-07-28T00:00:00 None -2019-07-29T00:00:00 None -2019-07-30T00:00:00 None -2019-07-31T00:00:00 None -2019-08-01T00:00:00 None -2019-08-02T00:00:00 None -2019-08-03T00:00:00 None -2019-08-04T00:00:00 None -2019-08-05T00:00:00 None -2019-08-06T00:00:00 None -2019-08-07T00:00:00 None -2019-08-08T00:00:00 None -2019-08-09T00:00:00 None -2019-08-10T00:00:00 None -2019-08-11T00:00:00 None -2019-08-12T00:00:00 None -2019-08-13T00:00:00 None -2019-08-14T00:00:00 None -2019-08-15T00:00:00 None -2019-08-16T00:00:00 None -2019-08-17T00:00:00 None -2019-08-18T00:00:00 None -2019-08-19T00:00:00 None -2019-08-20T00:00:00 None -2019-08-21T00:00:00 None -2019-08-22T00:00:00 None -2019-08-23T00:00:00 None -2019-08-24T00:00:00 None -2019-08-25T00:00:00 None -2019-08-26T00:00:00 None -2019-08-27T00:00:00 None -2019-08-28T00:00:00 None -2019-08-29T00:00:00 None -2019-08-30T00:00:00 None -2019-08-31T00:00:00 None -2019-09-01T00:00:00 None -2019-09-02T00:00:00 None -2019-09-03T00:00:00 None -2019-09-04T00:00:00 None -2019-09-05T00:00:00 None -2019-09-06T00:00:00 None -2019-09-07T00:00:00 None -2019-09-08T00:00:00 None -2019-09-09T00:00:00 None -2019-09-10T00:00:00 None -2019-09-11T00:00:00 None -2019-09-12T00:00:00 None -2019-09-13T00:00:00 None -2019-09-14T00:00:00 None -2019-09-15T00:00:00 None -2019-09-16T00:00:00 None -2019-09-17T00:00:00 None -2019-09-18T00:00:00 None -2019-09-19T00:00:00 None -2019-09-20T00:00:00 None -2019-09-21T00:00:00 None -2019-09-22T00:00:00 None -2019-09-23T00:00:00 None -2019-09-24T00:00:00 None -2019-09-25T00:00:00 None -2019-09-26T00:00:00 None -2019-09-27T00:00:00 None -2019-09-28T00:00:00 None -2019-09-29T00:00:00 None -2019-09-30T00:00:00 None -2019-10-01T00:00:00 None -2019-10-02T00:00:00 None -2019-10-03T00:00:00 None -2019-10-04T00:00:00 None -2019-10-05T00:00:00 None -2019-10-06T00:00:00 None -2019-10-07T00:00:00 None -2019-10-08T00:00:00 None -2019-10-09T00:00:00 None -2019-10-10T00:00:00 None -2019-10-11T00:00:00 None -2019-10-12T00:00:00 None -2019-10-13T00:00:00 None -2019-10-14T00:00:00 None -2019-10-15T00:00:00 None -2019-10-16T00:00:00 None -2019-10-17T00:00:00 None -2019-10-18T00:00:00 None -2019-10-19T00:00:00 None -2019-10-20T00:00:00 None -2019-10-21T00:00:00 None -2019-10-22T00:00:00 None -2019-10-23T00:00:00 None -2019-10-24T00:00:00 None -2019-10-25T00:00:00 None -2019-10-26T00:00:00 None -2019-10-27T00:00:00 None -2019-10-28T00:00:00 None -2019-10-29T00:00:00 None -2019-10-30T00:00:00 None -2019-10-31T00:00:00 None -2019-11-01T00:00:00 None -2019-11-02T00:00:00 None -2019-11-03T00:00:00 None -2019-11-04T00:00:00 None -2019-11-05T00:00:00 None -2019-11-06T00:00:00 None -2019-11-07T00:00:00 None -2019-11-08T00:00:00 None -2019-11-09T00:00:00 None -2019-11-10T00:00:00 None -2019-11-11T00:00:00 None -2019-11-12T00:00:00 None -2019-11-13T00:00:00 None -2019-11-14T00:00:00 None -2019-11-15T00:00:00 None -2019-11-16T00:00:00 None -2019-11-17T00:00:00 None -2019-11-18T00:00:00 None -2019-11-19T00:00:00 None -2019-11-20T00:00:00 None -2019-11-21T00:00:00 None -2019-11-22T00:00:00 None -2019-11-23T00:00:00 None -2019-11-24T00:00:00 None -2019-11-25T00:00:00 None -2019-11-26T00:00:00 None -2019-11-27T00:00:00 None -2019-11-28T00:00:00 None -2019-11-29T00:00:00 None -2019-11-30T00:00:00 None -2019-12-01T00:00:00 1 -2019-12-02T00:00:00 None -2019-12-03T00:00:00 None -2019-12-04T00:00:00 None -2019-12-05T00:00:00 None -2019-12-06T00:00:00 None -2019-12-07T00:00:00 None -2019-12-08T00:00:00 None -2019-12-09T00:00:00 None -2019-12-10T00:00:00 None -2019-12-11T00:00:00 None -2019-12-12T00:00:00 None -2019-12-13T00:00:00 None -2019-12-14T00:00:00 None -2019-12-15T00:00:00 None -2019-12-16T00:00:00 None -2019-12-17T00:00:00 None -2019-12-18T00:00:00 10 -2019-12-19T00:00:00 18 -2019-12-20T00:00:00 2 -2019-12-21T00:00:00 None -2019-12-22T00:00:00 None -2019-12-23T00:00:00 None -2019-12-24T00:00:00 None -2019-12-25T00:00:00 None -2019-12-26T00:00:00 None -2019-12-27T00:00:00 None -2019-12-28T00:00:00 None -2019-12-29T00:00:00 None -2019-12-30T00:00:00 None -2019-12-31T00:00:00 None -2020-01-01T00:00:00 5 -2020-01-02T00:00:00 9 -2020-01-03T00:00:00 1 -2020-01-04T00:00:00 None -2020-01-05T00:00:00 None -2020-01-06T00:00:00 None -2020-01-07T00:00:00 None -2020-01-08T00:00:00 None -2020-01-09T00:00:00 None -2020-01-10T00:00:00 None -2020-01-11T00:00:00 None -2020-01-12T00:00:00 None -2020-01-13T00:00:00 None -2020-01-14T00:00:00 None -2020-01-15T00:00:00 None -2020-01-16T00:00:00 None -2020-01-17T00:00:00 None -2020-01-18T00:00:00 None -2020-01-19T00:00:00 None -2020-01-20T00:00:00 None -2020-01-21T00:00:00 None -2020-01-22T00:00:00 None -2020-01-23T00:00:00 None -2020-01-24T00:00:00 None -2020-01-25T00:00:00 None -2020-01-26T00:00:00 None -2020-01-27T00:00:00 None -2020-01-28T00:00:00 None -2020-01-29T00:00:00 None -2020-01-30T00:00:00 None -2020-01-31T00:00:00 None -2020-02-01T00:00:00 None -2020-02-02T00:00:00 None -2020-02-03T00:00:00 None -2020-02-04T00:00:00 None -2020-02-05T00:00:00 None -2020-02-06T00:00:00 None -2020-02-07T00:00:00 None -2020-02-08T00:00:00 None -2020-02-09T00:00:00 None -2020-02-10T00:00:00 None -2020-02-11T00:00:00 None -2020-02-12T00:00:00 None -2020-02-13T00:00:00 None -2020-02-14T00:00:00 None -2020-02-15T00:00:00 None -2020-02-16T00:00:00 None -2020-02-17T00:00:00 None -2020-02-18T00:00:00 None -2020-02-19T00:00:00 None -2020-02-20T00:00:00 None -2020-02-21T00:00:00 None -2020-02-22T00:00:00 None -2020-02-23T00:00:00 None -2020-02-24T00:00:00 None -2020-02-25T00:00:00 None -2020-02-26T00:00:00 None -2020-02-27T00:00:00 None -2020-02-28T00:00:00 None -2020-02-29T00:00:00 None -2020-03-01T00:00:00 None -2020-03-02T00:00:00 None -2020-03-03T00:00:00 None -2020-03-04T00:00:00 None -2020-03-05T00:00:00 None -2020-03-06T00:00:00 None -2020-03-07T00:00:00 None -2020-03-08T00:00:00 None -2020-03-09T00:00:00 None -2020-03-10T00:00:00 None -2020-03-11T00:00:00 None -2020-03-12T00:00:00 None -2020-03-13T00:00:00 None -2020-03-14T00:00:00 None -2020-03-15T00:00:00 None -2020-03-16T00:00:00 None -2020-03-17T00:00:00 None -2020-03-18T00:00:00 None -2020-03-19T00:00:00 None -2020-03-20T00:00:00 None -2020-03-21T00:00:00 None -2020-03-22T00:00:00 None -2020-03-23T00:00:00 None -2020-03-24T00:00:00 None -2020-03-25T00:00:00 None -2020-03-26T00:00:00 None -2020-03-27T00:00:00 None -2020-03-28T00:00:00 None -2020-03-29T00:00:00 None -2020-03-30T00:00:00 None -2020-03-31T00:00:00 None -2020-04-01T00:00:00 None -2020-04-02T00:00:00 None -2020-04-03T00:00:00 None -2020-04-04T00:00:00 None -2020-04-05T00:00:00 None -2020-04-06T00:00:00 None -2020-04-07T00:00:00 None -2020-04-08T00:00:00 None -2020-04-09T00:00:00 None -2020-04-10T00:00:00 None -2020-04-11T00:00:00 None -2020-04-12T00:00:00 None -2020-04-13T00:00:00 None -2020-04-14T00:00:00 None -2020-04-15T00:00:00 None -2020-04-16T00:00:00 None -2020-04-17T00:00:00 None -2020-04-18T00:00:00 None -2020-04-19T00:00:00 None -2020-04-20T00:00:00 None -2020-04-21T00:00:00 None -2020-04-22T00:00:00 None -2020-04-23T00:00:00 None -2020-04-24T00:00:00 None -2020-04-25T00:00:00 None -2020-04-26T00:00:00 None -2020-04-27T00:00:00 None -2020-04-28T00:00:00 None -2020-04-29T00:00:00 None -2020-04-30T00:00:00 None -2020-05-01T00:00:00 None -2020-05-02T00:00:00 None -2020-05-03T00:00:00 None -2020-05-04T00:00:00 None -2020-05-05T00:00:00 None -2020-05-06T00:00:00 None -2020-05-07T00:00:00 None -2020-05-08T00:00:00 None -2020-05-09T00:00:00 None -2020-05-10T00:00:00 None -2020-05-11T00:00:00 None -2020-05-12T00:00:00 None -2020-05-13T00:00:00 None -2020-05-14T00:00:00 None -2020-05-15T00:00:00 None -2020-05-16T00:00:00 None -2020-05-17T00:00:00 None -2020-05-18T00:00:00 None -2020-05-19T00:00:00 None -2020-05-20T00:00:00 None -2020-05-21T00:00:00 None -2020-05-22T00:00:00 None -2020-05-23T00:00:00 None -2020-05-24T00:00:00 None -2020-05-25T00:00:00 None -2020-05-26T00:00:00 None -2020-05-27T00:00:00 None -2020-05-28T00:00:00 None -2020-05-29T00:00:00 None -2020-05-30T00:00:00 None -2020-05-31T00:00:00 None -2020-06-01T00:00:00 None -2020-06-02T00:00:00 None -2020-06-03T00:00:00 None -2020-06-04T00:00:00 None -2020-06-05T00:00:00 None -2020-06-06T00:00:00 None -2020-06-07T00:00:00 None -2020-06-08T00:00:00 None -2020-06-09T00:00:00 None -2020-06-10T00:00:00 None -2020-06-11T00:00:00 None -2020-06-12T00:00:00 None -2020-06-13T00:00:00 None -2020-06-14T00:00:00 None -2020-06-15T00:00:00 None -2020-06-16T00:00:00 None -2020-06-17T00:00:00 None -2020-06-18T00:00:00 None -2020-06-19T00:00:00 None -2020-06-20T00:00:00 None -2020-06-21T00:00:00 None -2020-06-22T00:00:00 None -2020-06-23T00:00:00 None -2020-06-24T00:00:00 None -2020-06-25T00:00:00 None -2020-06-26T00:00:00 None -2020-06-27T00:00:00 None -2020-06-28T00:00:00 None -2020-06-29T00:00:00 None -2020-06-30T00:00:00 None -2020-07-01T00:00:00 None -2020-07-02T00:00:00 None -2020-07-03T00:00:00 None -2020-07-04T00:00:00 None -2020-07-05T00:00:00 None -2020-07-06T00:00:00 None -2020-07-07T00:00:00 None -2020-07-08T00:00:00 None -2020-07-09T00:00:00 None -2020-07-10T00:00:00 None -2020-07-11T00:00:00 None -2020-07-12T00:00:00 None -2020-07-13T00:00:00 None -2020-07-14T00:00:00 None -2020-07-15T00:00:00 None -2020-07-16T00:00:00 None -2020-07-17T00:00:00 None -2020-07-18T00:00:00 None -2020-07-19T00:00:00 None -2020-07-20T00:00:00 None -2020-07-21T00:00:00 None -2020-07-22T00:00:00 None -2020-07-23T00:00:00 None -2020-07-24T00:00:00 None -2020-07-25T00:00:00 None -2020-07-26T00:00:00 None -2020-07-27T00:00:00 None -2020-07-28T00:00:00 None -2020-07-29T00:00:00 None -2020-07-30T00:00:00 None -2020-07-31T00:00:00 None -2020-08-01T00:00:00 None -2020-08-02T00:00:00 None -2020-08-03T00:00:00 None -2020-08-04T00:00:00 None -2020-08-05T00:00:00 None -2020-08-06T00:00:00 None -2020-08-07T00:00:00 None -2020-08-08T00:00:00 None -2020-08-09T00:00:00 None -2020-08-10T00:00:00 None -2020-08-11T00:00:00 None -2020-08-12T00:00:00 None -2020-08-13T00:00:00 None -2020-08-14T00:00:00 None -2020-08-15T00:00:00 None -2020-08-16T00:00:00 None -2020-08-17T00:00:00 None -2020-08-18T00:00:00 None -2020-08-19T00:00:00 None -2020-08-20T00:00:00 None -2020-08-21T00:00:00 None -2020-08-22T00:00:00 None -2020-08-23T00:00:00 None -2020-08-24T00:00:00 None -2020-08-25T00:00:00 None -2020-08-26T00:00:00 None -2020-08-27T00:00:00 None -2020-08-28T00:00:00 None -2020-08-29T00:00:00 None -2020-08-30T00:00:00 None -2020-08-31T00:00:00 None -2020-09-01T00:00:00 None -2020-09-02T00:00:00 None -2020-09-03T00:00:00 None -2020-09-04T00:00:00 None -2020-09-05T00:00:00 None -2020-09-06T00:00:00 None -2020-09-07T00:00:00 None -2020-09-08T00:00:00 None -2020-09-09T00:00:00 None -2020-09-10T00:00:00 None -2020-09-11T00:00:00 None -2020-09-12T00:00:00 None -2020-09-13T00:00:00 None -2020-09-14T00:00:00 None -2020-09-15T00:00:00 None -2020-09-16T00:00:00 None -2020-09-17T00:00:00 None -2020-09-18T00:00:00 None -2020-09-19T00:00:00 None -2020-09-20T00:00:00 None -2020-09-21T00:00:00 None -2020-09-22T00:00:00 None -2020-09-23T00:00:00 None -2020-09-24T00:00:00 None -2020-09-25T00:00:00 None -2020-09-26T00:00:00 None -2020-09-27T00:00:00 None -2020-09-28T00:00:00 None -2020-09-29T00:00:00 None -2020-09-30T00:00:00 None -2020-10-01T00:00:00 None -2020-10-02T00:00:00 None -2020-10-03T00:00:00 None -2020-10-04T00:00:00 None -2020-10-05T00:00:00 None -2020-10-06T00:00:00 None -2020-10-07T00:00:00 None -2020-10-08T00:00:00 None -2020-10-09T00:00:00 None -2020-10-10T00:00:00 None -2020-10-11T00:00:00 None -2020-10-12T00:00:00 None -2020-10-13T00:00:00 None -2020-10-14T00:00:00 None -2020-10-15T00:00:00 None -2020-10-16T00:00:00 None -2020-10-17T00:00:00 None -2020-10-18T00:00:00 None -2020-10-19T00:00:00 None -2020-10-20T00:00:00 None -2020-10-21T00:00:00 None -2020-10-22T00:00:00 None -2020-10-23T00:00:00 None -2020-10-24T00:00:00 None -2020-10-25T00:00:00 None -2020-10-26T00:00:00 None -2020-10-27T00:00:00 None -2020-10-28T00:00:00 None -2020-10-29T00:00:00 None -2020-10-30T00:00:00 None -2020-10-31T00:00:00 None -2020-11-01T00:00:00 None -2020-11-02T00:00:00 None -2020-11-03T00:00:00 None -2020-11-04T00:00:00 None -2020-11-05T00:00:00 None -2020-11-06T00:00:00 None -2020-11-07T00:00:00 None -2020-11-08T00:00:00 None -2020-11-09T00:00:00 None -2020-11-10T00:00:00 None -2020-11-11T00:00:00 None -2020-11-12T00:00:00 None -2020-11-13T00:00:00 None -2020-11-14T00:00:00 None -2020-11-15T00:00:00 None -2020-11-16T00:00:00 None -2020-11-17T00:00:00 None -2020-11-18T00:00:00 None -2020-11-19T00:00:00 None -2020-11-20T00:00:00 None -2020-11-21T00:00:00 None -2020-11-22T00:00:00 None -2020-11-23T00:00:00 None -2020-11-24T00:00:00 None -2020-11-25T00:00:00 None -2020-11-26T00:00:00 None -2020-11-27T00:00:00 None -2020-11-28T00:00:00 None -2020-11-29T00:00:00 None -2020-11-30T00:00:00 None -2020-12-01T00:00:00 None -2020-12-02T00:00:00 None -2020-12-03T00:00:00 None -2020-12-04T00:00:00 None -2020-12-05T00:00:00 None -2020-12-06T00:00:00 None -2020-12-07T00:00:00 None -2020-12-08T00:00:00 None -2020-12-09T00:00:00 None -2020-12-10T00:00:00 None -2020-12-11T00:00:00 None -2020-12-12T00:00:00 None -2020-12-13T00:00:00 None -2020-12-14T00:00:00 None -2020-12-15T00:00:00 None -2020-12-16T00:00:00 None -2020-12-17T00:00:00 None -2020-12-18T00:00:00 None -2020-12-19T00:00:00 None -2020-12-20T00:00:00 None -2020-12-21T00:00:00 None -2020-12-22T00:00:00 None -2020-12-23T00:00:00 None -2020-12-24T00:00:00 None -2020-12-25T00:00:00 None -2020-12-26T00:00:00 None -2020-12-27T00:00:00 None -2020-12-28T00:00:00 None -2020-12-29T00:00:00 None -2020-12-30T00:00:00 None -2020-12-31T00:00:00 None -2021-01-01T00:00:00 None -2021-01-02T00:00:00 None -2021-01-03T00:00:00 None -2021-01-04T00:00:00 None -2021-01-05T00:00:00 None -2021-01-06T00:00:00 None -2021-01-07T00:00:00 None -2021-01-08T00:00:00 None -2021-01-09T00:00:00 None -2021-01-10T00:00:00 None -2021-01-11T00:00:00 None -2021-01-12T00:00:00 None -2021-01-13T00:00:00 None -2021-01-14T00:00:00 None -2021-01-15T00:00:00 None -2021-01-16T00:00:00 None -2021-01-17T00:00:00 None -2021-01-18T00:00:00 None -2021-01-19T00:00:00 None -2021-01-20T00:00:00 None -2021-01-21T00:00:00 None -2021-01-22T00:00:00 None -2021-01-23T00:00:00 None -2021-01-24T00:00:00 None -2021-01-25T00:00:00 None -2021-01-26T00:00:00 None -2021-01-27T00:00:00 None -2021-01-28T00:00:00 None -2021-01-29T00:00:00 None -2021-01-30T00:00:00 None -2021-01-31T00:00:00 None -2021-02-01T00:00:00 None -2021-02-02T00:00:00 None -2021-02-03T00:00:00 None -2021-02-04T00:00:00 None -2021-02-05T00:00:00 None -2021-02-06T00:00:00 None -2021-02-07T00:00:00 None -2021-02-08T00:00:00 None -2021-02-09T00:00:00 None -2021-02-10T00:00:00 None -2021-02-11T00:00:00 None -2021-02-12T00:00:00 None -2021-02-13T00:00:00 None -2021-02-14T00:00:00 None -2021-02-15T00:00:00 None -2021-02-16T00:00:00 None -2021-02-17T00:00:00 None -2021-02-18T00:00:00 None -2021-02-19T00:00:00 None -2021-02-20T00:00:00 None -2021-02-21T00:00:00 None -2021-02-22T00:00:00 None -2021-02-23T00:00:00 None -2021-02-24T00:00:00 None -2021-02-25T00:00:00 None -2021-02-26T00:00:00 None -2021-02-27T00:00:00 None -2021-02-28T00:00:00 None -2021-03-01T00:00:00 None -2021-03-02T00:00:00 None -2021-03-03T00:00:00 None -2021-03-04T00:00:00 None -2021-03-05T00:00:00 None -2021-03-06T00:00:00 None -2021-03-07T00:00:00 None -2021-03-08T00:00:00 None -2021-03-09T00:00:00 None -2021-03-10T00:00:00 None -2021-03-11T00:00:00 None -2021-03-12T00:00:00 None -2021-03-13T00:00:00 None -2021-03-14T00:00:00 None -2021-03-15T00:00:00 None -2021-03-16T00:00:00 None -2021-03-17T00:00:00 None -2021-03-18T00:00:00 None -2021-03-19T00:00:00 None -2021-03-20T00:00:00 None -2021-03-21T00:00:00 None -2021-03-22T00:00:00 None -2021-03-23T00:00:00 None -2021-03-24T00:00:00 None -2021-03-25T00:00:00 None -2021-03-26T00:00:00 None -2021-03-27T00:00:00 None -2021-03-28T00:00:00 None -2021-03-29T00:00:00 None -2021-03-30T00:00:00 None -2021-03-31T00:00:00 None -2021-04-01T00:00:00 None -2021-04-02T00:00:00 None -2021-04-03T00:00:00 None -2021-04-04T00:00:00 None -2021-04-05T00:00:00 None -2021-04-06T00:00:00 None -2021-04-07T00:00:00 None -2021-04-08T00:00:00 None -2021-04-09T00:00:00 None -2021-04-10T00:00:00 None -2021-04-11T00:00:00 None -2021-04-12T00:00:00 None -2021-04-13T00:00:00 None -2021-04-14T00:00:00 None -2021-04-15T00:00:00 None -2021-04-16T00:00:00 None -2021-04-17T00:00:00 None -2021-04-18T00:00:00 None -2021-04-19T00:00:00 None -2021-04-20T00:00:00 None -2021-04-21T00:00:00 None -2021-04-22T00:00:00 None -2021-04-23T00:00:00 None -2021-04-24T00:00:00 None -2021-04-25T00:00:00 None -2021-04-26T00:00:00 None -2021-04-27T00:00:00 None -2021-04-28T00:00:00 None -2021-04-29T00:00:00 None -2021-04-30T00:00:00 None -2021-05-01T00:00:00 None -2021-05-02T00:00:00 None -2021-05-03T00:00:00 None -2021-05-04T00:00:00 None -2021-05-05T00:00:00 None -2021-05-06T00:00:00 None -2021-05-07T00:00:00 None -2021-05-08T00:00:00 None -2021-05-09T00:00:00 None -2021-05-10T00:00:00 None -2021-05-11T00:00:00 None -2021-05-12T00:00:00 None -2021-05-13T00:00:00 None -2021-05-14T00:00:00 None -2021-05-15T00:00:00 None -2021-05-16T00:00:00 None -2021-05-17T00:00:00 None -2021-05-18T00:00:00 None -2021-05-19T00:00:00 None -2021-05-20T00:00:00 None -2021-05-21T00:00:00 None -2021-05-22T00:00:00 None -2021-05-23T00:00:00 None -2021-05-24T00:00:00 None -2021-05-25T00:00:00 None -2021-05-26T00:00:00 None -2021-05-27T00:00:00 None -2021-05-28T00:00:00 None -2021-05-29T00:00:00 None -2021-05-30T00:00:00 None -2021-05-31T00:00:00 None -2021-06-01T00:00:00 None -2021-06-02T00:00:00 None -2021-06-03T00:00:00 None -2021-06-04T00:00:00 None -2021-06-05T00:00:00 None -2021-06-06T00:00:00 None -2021-06-07T00:00:00 None -2021-06-08T00:00:00 None -2021-06-09T00:00:00 None -2021-06-10T00:00:00 None -2021-06-11T00:00:00 None -2021-06-12T00:00:00 None -2021-06-13T00:00:00 None -2021-06-14T00:00:00 None -2021-06-15T00:00:00 None -2021-06-16T00:00:00 None -2021-06-17T00:00:00 None -2021-06-18T00:00:00 None -2021-06-19T00:00:00 None -2021-06-20T00:00:00 None -2021-06-21T00:00:00 None -2021-06-22T00:00:00 None -2021-06-23T00:00:00 None -2021-06-24T00:00:00 None -2021-06-25T00:00:00 None -2021-06-26T00:00:00 None -2021-06-27T00:00:00 None -2021-06-28T00:00:00 None -2021-06-29T00:00:00 None -2021-06-30T00:00:00 None -2021-07-01T00:00:00 None -2021-07-02T00:00:00 None -2021-07-03T00:00:00 None -2021-07-04T00:00:00 None -2021-07-05T00:00:00 None -2021-07-06T00:00:00 None -2021-07-07T00:00:00 None -2021-07-08T00:00:00 None -2021-07-09T00:00:00 None -2021-07-10T00:00:00 None -2021-07-11T00:00:00 None -2021-07-12T00:00:00 None -2021-07-13T00:00:00 None -2021-07-14T00:00:00 None -2021-07-15T00:00:00 None -2021-07-16T00:00:00 None -2021-07-17T00:00:00 None -2021-07-18T00:00:00 None -2021-07-19T00:00:00 None -2021-07-20T00:00:00 None -2021-07-21T00:00:00 None -2021-07-22T00:00:00 None -2021-07-23T00:00:00 None -2021-07-24T00:00:00 None -2021-07-25T00:00:00 None -2021-07-26T00:00:00 None -2021-07-27T00:00:00 None -2021-07-28T00:00:00 None -2021-07-29T00:00:00 None -2021-07-30T00:00:00 None -2021-07-31T00:00:00 None -2021-08-01T00:00:00 None -2021-08-02T00:00:00 None -2021-08-03T00:00:00 None -2021-08-04T00:00:00 None -2021-08-05T00:00:00 None -2021-08-06T00:00:00 None -2021-08-07T00:00:00 None -2021-08-08T00:00:00 None -2021-08-09T00:00:00 None -2021-08-10T00:00:00 None -2021-08-11T00:00:00 None -2021-08-12T00:00:00 None -2021-08-13T00:00:00 None -2021-08-14T00:00:00 None -2021-08-15T00:00:00 None -2021-08-16T00:00:00 None -2021-08-17T00:00:00 None -2021-08-18T00:00:00 None -2021-08-19T00:00:00 None -2021-08-20T00:00:00 None -2021-08-21T00:00:00 None -2021-08-22T00:00:00 None -2021-08-23T00:00:00 None -2021-08-24T00:00:00 None -2021-08-25T00:00:00 None -2021-08-26T00:00:00 None -2021-08-27T00:00:00 None -2021-08-28T00:00:00 None -2021-08-29T00:00:00 None -2021-08-30T00:00:00 None -2021-08-31T00:00:00 None -2021-09-01T00:00:00 None -2021-09-02T00:00:00 None -2021-09-03T00:00:00 None -2021-09-04T00:00:00 None -2021-09-05T00:00:00 None -2021-09-06T00:00:00 None -2021-09-07T00:00:00 None -2021-09-08T00:00:00 None -2021-09-09T00:00:00 None -2021-09-10T00:00:00 None -2021-09-11T00:00:00 None -2021-09-12T00:00:00 None -2021-09-13T00:00:00 None -2021-09-14T00:00:00 None -2021-09-15T00:00:00 None -2021-09-16T00:00:00 None -2021-09-17T00:00:00 None -2021-09-18T00:00:00 None -2021-09-19T00:00:00 None -2021-09-20T00:00:00 None -2021-09-21T00:00:00 None -2021-09-22T00:00:00 None -2021-09-23T00:00:00 None -2021-09-24T00:00:00 None -2021-09-25T00:00:00 None -2021-09-26T00:00:00 None -2021-09-27T00:00:00 None -2021-09-28T00:00:00 None -2021-09-29T00:00:00 None -2021-09-30T00:00:00 None -2021-10-01T00:00:00 None -2021-10-02T00:00:00 None -2021-10-03T00:00:00 None -2021-10-04T00:00:00 None -2021-10-05T00:00:00 None -2021-10-06T00:00:00 None -2021-10-07T00:00:00 None -2021-10-08T00:00:00 None -2021-10-09T00:00:00 None -2021-10-10T00:00:00 None -2021-10-11T00:00:00 None -2021-10-12T00:00:00 None -2021-10-13T00:00:00 None -2021-10-14T00:00:00 None -2021-10-15T00:00:00 None -2021-10-16T00:00:00 None -2021-10-17T00:00:00 None -2021-10-18T00:00:00 None -2021-10-19T00:00:00 None -2021-10-20T00:00:00 None -2021-10-21T00:00:00 None -2021-10-22T00:00:00 None -2021-10-23T00:00:00 None -2021-10-24T00:00:00 None -2021-10-25T00:00:00 None -2021-10-26T00:00:00 None -2021-10-27T00:00:00 None -2021-10-28T00:00:00 None -2021-10-29T00:00:00 None -2021-10-30T00:00:00 None -2021-10-31T00:00:00 None -2021-11-01T00:00:00 None -2021-11-02T00:00:00 None -2021-11-03T00:00:00 None -2021-11-04T00:00:00 None -2021-11-05T00:00:00 None -2021-11-06T00:00:00 None -2021-11-07T00:00:00 None -2021-11-08T00:00:00 None -2021-11-09T00:00:00 None -2021-11-10T00:00:00 None -2021-11-11T00:00:00 None -2021-11-12T00:00:00 None -2021-11-13T00:00:00 None -2021-11-14T00:00:00 None -2021-11-15T00:00:00 None -2021-11-16T00:00:00 None -2021-11-17T00:00:00 None -2021-11-18T00:00:00 None -2021-11-19T00:00:00 None -2021-11-20T00:00:00 None -2021-11-21T00:00:00 None -2021-11-22T00:00:00 None -2021-11-23T00:00:00 None -2021-11-24T00:00:00 None -2021-11-25T00:00:00 None +metric_time__day bookings_join_to_time_spine +------------------ ----------------------------- diff --git a/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Postgres/test_join_to_time_spine_with_custom_grain_in_group_by__query_output.txt b/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Postgres/test_join_to_time_spine_with_custom_grain_in_group_by__query_output.txt index 6f1e747281..6906a594ac 100644 --- a/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Postgres/test_join_to_time_spine_with_custom_grain_in_group_by__query_output.txt +++ b/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Postgres/test_join_to_time_spine_with_custom_grain_in_group_by__query_output.txt @@ -1,20 +1,10 @@ test_name: test_join_to_time_spine_with_custom_grain_in_group_by test_filename: test_fill_nulls_with_0.py --- -booking__ds__martian_day bookings_join_to_time_spine --------------------------- ----------------------------- -2020-01-01T00:00:00 None -2020-01-02T00:00:00 None -2020-01-03T00:00:00 None -2020-01-04T00:00:00 None -2020-01-05T00:00:00 None -2020-01-06T00:00:00 None -2020-01-07T00:00:00 None -2020-01-08T00:00:00 46 -2020-01-09T00:00:00 None -2020-01-10T00:00:00 None -2020-01-11T00:00:00 None -2020-01-12T00:00:00 None -2020-01-13T00:00:00 None -2020-01-14T00:00:00 None -2020-01-15T00:00:00 None +booking__ds__alien_day bookings_join_to_time_spine +------------------------ ----------------------------- +2020-01-01T00:00:00 None +2020-01-02T00:00:00 31 +2020-01-03T00:00:00 15 +2020-01-04T00:00:00 None +2020-01-05T00:00:00 None diff --git a/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Postgres/test_join_to_timespine_metric_with_custom_granularity_filter__query_output.txt b/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Postgres/test_join_to_timespine_metric_with_custom_granularity_filter__query_output.txt index 1363607ee0..f755f5ad45 100644 --- a/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Postgres/test_join_to_timespine_metric_with_custom_granularity_filter__query_output.txt +++ b/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Postgres/test_join_to_timespine_metric_with_custom_granularity_filter__query_output.txt @@ -1,6 +1,5 @@ test_name: test_join_to_timespine_metric_with_custom_granularity_filter test_filename: test_fill_nulls_with_0.py --- -metric_time__martian_day bookings_join_to_time_spine --------------------------- ----------------------------- -2020-01-08T00:00:00 46 +metric_time__alien_day bookings_join_to_time_spine +------------------------ ----------------------------- diff --git a/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Postgres/test_join_to_timespine_metric_with_custom_granularity_filter_not_in_group_by__query_output.txt b/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Postgres/test_join_to_timespine_metric_with_custom_granularity_filter_not_in_group_by__query_output.txt index c980e19fb0..8452166bf9 100644 --- a/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Postgres/test_join_to_timespine_metric_with_custom_granularity_filter_not_in_group_by__query_output.txt +++ b/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Postgres/test_join_to_timespine_metric_with_custom_granularity_filter_not_in_group_by__query_output.txt @@ -1,1005 +1,5 @@ test_name: test_join_to_timespine_metric_with_custom_granularity_filter_not_in_group_by test_filename: test_fill_nulls_with_0.py --- -metric_time__day bookings_join_to_time_spine -------------------- ----------------------------- -2019-03-02T00:00:00 None -2019-03-03T00:00:00 None -2019-03-04T00:00:00 None -2019-03-05T00:00:00 None -2019-03-06T00:00:00 None -2019-03-07T00:00:00 None -2019-03-08T00:00:00 None -2019-03-09T00:00:00 None -2019-03-10T00:00:00 None -2019-03-11T00:00:00 None -2019-03-12T00:00:00 None -2019-03-13T00:00:00 None -2019-03-14T00:00:00 None -2019-03-15T00:00:00 None -2019-03-16T00:00:00 None -2019-03-17T00:00:00 None -2019-03-18T00:00:00 None -2019-03-19T00:00:00 None -2019-03-20T00:00:00 None -2019-03-21T00:00:00 None -2019-03-22T00:00:00 None -2019-03-23T00:00:00 None -2019-03-24T00:00:00 None -2019-03-25T00:00:00 None -2019-03-26T00:00:00 None -2019-03-27T00:00:00 None -2019-03-28T00:00:00 None -2019-03-29T00:00:00 None -2019-03-30T00:00:00 None -2019-03-31T00:00:00 None -2019-04-01T00:00:00 None -2019-04-02T00:00:00 None -2019-04-03T00:00:00 None -2019-04-04T00:00:00 None -2019-04-05T00:00:00 None -2019-04-06T00:00:00 None -2019-04-07T00:00:00 None -2019-04-08T00:00:00 None -2019-04-09T00:00:00 None -2019-04-10T00:00:00 None -2019-04-11T00:00:00 None -2019-04-12T00:00:00 None -2019-04-13T00:00:00 None -2019-04-14T00:00:00 None -2019-04-15T00:00:00 None -2019-04-16T00:00:00 None -2019-04-17T00:00:00 None -2019-04-18T00:00:00 None -2019-04-19T00:00:00 None -2019-04-20T00:00:00 None -2019-04-21T00:00:00 None -2019-04-22T00:00:00 None -2019-04-23T00:00:00 None -2019-04-24T00:00:00 None -2019-04-25T00:00:00 None -2019-04-26T00:00:00 None -2019-04-27T00:00:00 None -2019-04-28T00:00:00 None -2019-04-29T00:00:00 None -2019-04-30T00:00:00 None -2019-05-01T00:00:00 None -2019-05-02T00:00:00 None -2019-05-03T00:00:00 None -2019-05-04T00:00:00 None -2019-05-05T00:00:00 None -2019-05-06T00:00:00 None -2019-05-07T00:00:00 None -2019-05-08T00:00:00 None -2019-05-09T00:00:00 None -2019-05-10T00:00:00 None -2019-05-11T00:00:00 None -2019-05-12T00:00:00 None -2019-05-13T00:00:00 None -2019-05-14T00:00:00 None -2019-05-15T00:00:00 None -2019-05-16T00:00:00 None -2019-05-17T00:00:00 None -2019-05-18T00:00:00 None -2019-05-19T00:00:00 None -2019-05-20T00:00:00 None -2019-05-21T00:00:00 None -2019-05-22T00:00:00 None -2019-05-23T00:00:00 None -2019-05-24T00:00:00 None -2019-05-25T00:00:00 None -2019-05-26T00:00:00 None -2019-05-27T00:00:00 None -2019-05-28T00:00:00 None -2019-05-29T00:00:00 None -2019-05-30T00:00:00 None -2019-05-31T00:00:00 None -2019-06-01T00:00:00 None -2019-06-02T00:00:00 None -2019-06-03T00:00:00 None -2019-06-04T00:00:00 None -2019-06-05T00:00:00 None -2019-06-06T00:00:00 None -2019-06-07T00:00:00 None -2019-06-08T00:00:00 None -2019-06-09T00:00:00 None -2019-06-10T00:00:00 None -2019-06-11T00:00:00 None -2019-06-12T00:00:00 None -2019-06-13T00:00:00 None -2019-06-14T00:00:00 None -2019-06-15T00:00:00 None -2019-06-16T00:00:00 None -2019-06-17T00:00:00 None -2019-06-18T00:00:00 None -2019-06-19T00:00:00 None -2019-06-20T00:00:00 None -2019-06-21T00:00:00 None -2019-06-22T00:00:00 None -2019-06-23T00:00:00 None -2019-06-24T00:00:00 None -2019-06-25T00:00:00 None -2019-06-26T00:00:00 None -2019-06-27T00:00:00 None -2019-06-28T00:00:00 None -2019-06-29T00:00:00 None -2019-06-30T00:00:00 None -2019-07-01T00:00:00 None -2019-07-02T00:00:00 None -2019-07-03T00:00:00 None -2019-07-04T00:00:00 None -2019-07-05T00:00:00 None -2019-07-06T00:00:00 None -2019-07-07T00:00:00 None -2019-07-08T00:00:00 None -2019-07-09T00:00:00 None -2019-07-10T00:00:00 None -2019-07-11T00:00:00 None -2019-07-12T00:00:00 None -2019-07-13T00:00:00 None -2019-07-14T00:00:00 None -2019-07-15T00:00:00 None -2019-07-16T00:00:00 None -2019-07-17T00:00:00 None -2019-07-18T00:00:00 None -2019-07-19T00:00:00 None -2019-07-20T00:00:00 None -2019-07-21T00:00:00 None -2019-07-22T00:00:00 None -2019-07-23T00:00:00 None -2019-07-24T00:00:00 None -2019-07-25T00:00:00 None -2019-07-26T00:00:00 None -2019-07-27T00:00:00 None -2019-07-28T00:00:00 None -2019-07-29T00:00:00 None -2019-07-30T00:00:00 None -2019-07-31T00:00:00 None -2019-08-01T00:00:00 None -2019-08-02T00:00:00 None -2019-08-03T00:00:00 None -2019-08-04T00:00:00 None -2019-08-05T00:00:00 None -2019-08-06T00:00:00 None -2019-08-07T00:00:00 None -2019-08-08T00:00:00 None -2019-08-09T00:00:00 None -2019-08-10T00:00:00 None -2019-08-11T00:00:00 None -2019-08-12T00:00:00 None -2019-08-13T00:00:00 None -2019-08-14T00:00:00 None -2019-08-15T00:00:00 None -2019-08-16T00:00:00 None -2019-08-17T00:00:00 None -2019-08-18T00:00:00 None -2019-08-19T00:00:00 None -2019-08-20T00:00:00 None -2019-08-21T00:00:00 None -2019-08-22T00:00:00 None -2019-08-23T00:00:00 None -2019-08-24T00:00:00 None -2019-08-25T00:00:00 None -2019-08-26T00:00:00 None -2019-08-27T00:00:00 None -2019-08-28T00:00:00 None -2019-08-29T00:00:00 None -2019-08-30T00:00:00 None -2019-08-31T00:00:00 None -2019-09-01T00:00:00 None -2019-09-02T00:00:00 None -2019-09-03T00:00:00 None -2019-09-04T00:00:00 None -2019-09-05T00:00:00 None -2019-09-06T00:00:00 None -2019-09-07T00:00:00 None -2019-09-08T00:00:00 None -2019-09-09T00:00:00 None -2019-09-10T00:00:00 None -2019-09-11T00:00:00 None -2019-09-12T00:00:00 None -2019-09-13T00:00:00 None -2019-09-14T00:00:00 None -2019-09-15T00:00:00 None -2019-09-16T00:00:00 None -2019-09-17T00:00:00 None -2019-09-18T00:00:00 None -2019-09-19T00:00:00 None -2019-09-20T00:00:00 None -2019-09-21T00:00:00 None -2019-09-22T00:00:00 None -2019-09-23T00:00:00 None -2019-09-24T00:00:00 None -2019-09-25T00:00:00 None -2019-09-26T00:00:00 None -2019-09-27T00:00:00 None -2019-09-28T00:00:00 None -2019-09-29T00:00:00 None -2019-09-30T00:00:00 None -2019-10-01T00:00:00 None -2019-10-02T00:00:00 None -2019-10-03T00:00:00 None -2019-10-04T00:00:00 None -2019-10-05T00:00:00 None -2019-10-06T00:00:00 None -2019-10-07T00:00:00 None -2019-10-08T00:00:00 None -2019-10-09T00:00:00 None -2019-10-10T00:00:00 None -2019-10-11T00:00:00 None -2019-10-12T00:00:00 None -2019-10-13T00:00:00 None -2019-10-14T00:00:00 None -2019-10-15T00:00:00 None -2019-10-16T00:00:00 None -2019-10-17T00:00:00 None -2019-10-18T00:00:00 None -2019-10-19T00:00:00 None -2019-10-20T00:00:00 None -2019-10-21T00:00:00 None -2019-10-22T00:00:00 None -2019-10-23T00:00:00 None -2019-10-24T00:00:00 None -2019-10-25T00:00:00 None -2019-10-26T00:00:00 None -2019-10-27T00:00:00 None -2019-10-28T00:00:00 None -2019-10-29T00:00:00 None -2019-10-30T00:00:00 None -2019-10-31T00:00:00 None -2019-11-01T00:00:00 None -2019-11-02T00:00:00 None -2019-11-03T00:00:00 None -2019-11-04T00:00:00 None -2019-11-05T00:00:00 None -2019-11-06T00:00:00 None -2019-11-07T00:00:00 None -2019-11-08T00:00:00 None -2019-11-09T00:00:00 None -2019-11-10T00:00:00 None -2019-11-11T00:00:00 None -2019-11-12T00:00:00 None -2019-11-13T00:00:00 None -2019-11-14T00:00:00 None -2019-11-15T00:00:00 None -2019-11-16T00:00:00 None -2019-11-17T00:00:00 None -2019-11-18T00:00:00 None -2019-11-19T00:00:00 None -2019-11-20T00:00:00 None -2019-11-21T00:00:00 None -2019-11-22T00:00:00 None -2019-11-23T00:00:00 None -2019-11-24T00:00:00 None -2019-11-25T00:00:00 None -2019-11-26T00:00:00 None -2019-11-27T00:00:00 None -2019-11-28T00:00:00 None -2019-11-29T00:00:00 None -2019-11-30T00:00:00 None -2019-12-01T00:00:00 1 -2019-12-02T00:00:00 None -2019-12-03T00:00:00 None -2019-12-04T00:00:00 None -2019-12-05T00:00:00 None -2019-12-06T00:00:00 None -2019-12-07T00:00:00 None -2019-12-08T00:00:00 None -2019-12-09T00:00:00 None -2019-12-10T00:00:00 None -2019-12-11T00:00:00 None -2019-12-12T00:00:00 None -2019-12-13T00:00:00 None -2019-12-14T00:00:00 None -2019-12-15T00:00:00 None -2019-12-16T00:00:00 None -2019-12-17T00:00:00 None -2019-12-18T00:00:00 10 -2019-12-19T00:00:00 18 -2019-12-20T00:00:00 2 -2019-12-21T00:00:00 None -2019-12-22T00:00:00 None -2019-12-23T00:00:00 None -2019-12-24T00:00:00 None -2019-12-25T00:00:00 None -2019-12-26T00:00:00 None -2019-12-27T00:00:00 None -2019-12-28T00:00:00 None -2019-12-29T00:00:00 None -2019-12-30T00:00:00 None -2019-12-31T00:00:00 None -2020-01-01T00:00:00 5 -2020-01-02T00:00:00 9 -2020-01-03T00:00:00 1 -2020-01-04T00:00:00 None -2020-01-05T00:00:00 None -2020-01-06T00:00:00 None -2020-01-07T00:00:00 None -2020-01-08T00:00:00 None -2020-01-09T00:00:00 None -2020-01-10T00:00:00 None -2020-01-11T00:00:00 None -2020-01-12T00:00:00 None -2020-01-13T00:00:00 None -2020-01-14T00:00:00 None -2020-01-15T00:00:00 None -2020-01-16T00:00:00 None -2020-01-17T00:00:00 None -2020-01-18T00:00:00 None -2020-01-19T00:00:00 None -2020-01-20T00:00:00 None -2020-01-21T00:00:00 None -2020-01-22T00:00:00 None -2020-01-23T00:00:00 None -2020-01-24T00:00:00 None -2020-01-25T00:00:00 None -2020-01-26T00:00:00 None -2020-01-27T00:00:00 None -2020-01-28T00:00:00 None -2020-01-29T00:00:00 None -2020-01-30T00:00:00 None -2020-01-31T00:00:00 None -2020-02-01T00:00:00 None -2020-02-02T00:00:00 None -2020-02-03T00:00:00 None -2020-02-04T00:00:00 None -2020-02-05T00:00:00 None -2020-02-06T00:00:00 None -2020-02-07T00:00:00 None -2020-02-08T00:00:00 None -2020-02-09T00:00:00 None -2020-02-10T00:00:00 None -2020-02-11T00:00:00 None -2020-02-12T00:00:00 None -2020-02-13T00:00:00 None -2020-02-14T00:00:00 None -2020-02-15T00:00:00 None -2020-02-16T00:00:00 None -2020-02-17T00:00:00 None -2020-02-18T00:00:00 None -2020-02-19T00:00:00 None -2020-02-20T00:00:00 None -2020-02-21T00:00:00 None -2020-02-22T00:00:00 None -2020-02-23T00:00:00 None -2020-02-24T00:00:00 None -2020-02-25T00:00:00 None -2020-02-26T00:00:00 None -2020-02-27T00:00:00 None -2020-02-28T00:00:00 None -2020-02-29T00:00:00 None -2020-03-01T00:00:00 None -2020-03-02T00:00:00 None -2020-03-03T00:00:00 None -2020-03-04T00:00:00 None -2020-03-05T00:00:00 None -2020-03-06T00:00:00 None -2020-03-07T00:00:00 None -2020-03-08T00:00:00 None -2020-03-09T00:00:00 None -2020-03-10T00:00:00 None -2020-03-11T00:00:00 None -2020-03-12T00:00:00 None -2020-03-13T00:00:00 None -2020-03-14T00:00:00 None -2020-03-15T00:00:00 None -2020-03-16T00:00:00 None -2020-03-17T00:00:00 None -2020-03-18T00:00:00 None -2020-03-19T00:00:00 None -2020-03-20T00:00:00 None -2020-03-21T00:00:00 None -2020-03-22T00:00:00 None -2020-03-23T00:00:00 None -2020-03-24T00:00:00 None -2020-03-25T00:00:00 None -2020-03-26T00:00:00 None -2020-03-27T00:00:00 None -2020-03-28T00:00:00 None -2020-03-29T00:00:00 None -2020-03-30T00:00:00 None -2020-03-31T00:00:00 None -2020-04-01T00:00:00 None -2020-04-02T00:00:00 None -2020-04-03T00:00:00 None -2020-04-04T00:00:00 None -2020-04-05T00:00:00 None -2020-04-06T00:00:00 None -2020-04-07T00:00:00 None -2020-04-08T00:00:00 None -2020-04-09T00:00:00 None -2020-04-10T00:00:00 None -2020-04-11T00:00:00 None -2020-04-12T00:00:00 None -2020-04-13T00:00:00 None -2020-04-14T00:00:00 None -2020-04-15T00:00:00 None -2020-04-16T00:00:00 None -2020-04-17T00:00:00 None -2020-04-18T00:00:00 None -2020-04-19T00:00:00 None -2020-04-20T00:00:00 None -2020-04-21T00:00:00 None -2020-04-22T00:00:00 None -2020-04-23T00:00:00 None -2020-04-24T00:00:00 None -2020-04-25T00:00:00 None -2020-04-26T00:00:00 None -2020-04-27T00:00:00 None -2020-04-28T00:00:00 None -2020-04-29T00:00:00 None -2020-04-30T00:00:00 None -2020-05-01T00:00:00 None -2020-05-02T00:00:00 None -2020-05-03T00:00:00 None -2020-05-04T00:00:00 None -2020-05-05T00:00:00 None -2020-05-06T00:00:00 None -2020-05-07T00:00:00 None -2020-05-08T00:00:00 None -2020-05-09T00:00:00 None -2020-05-10T00:00:00 None -2020-05-11T00:00:00 None -2020-05-12T00:00:00 None -2020-05-13T00:00:00 None -2020-05-14T00:00:00 None -2020-05-15T00:00:00 None -2020-05-16T00:00:00 None -2020-05-17T00:00:00 None -2020-05-18T00:00:00 None -2020-05-19T00:00:00 None -2020-05-20T00:00:00 None -2020-05-21T00:00:00 None -2020-05-22T00:00:00 None -2020-05-23T00:00:00 None -2020-05-24T00:00:00 None -2020-05-25T00:00:00 None -2020-05-26T00:00:00 None -2020-05-27T00:00:00 None -2020-05-28T00:00:00 None -2020-05-29T00:00:00 None -2020-05-30T00:00:00 None -2020-05-31T00:00:00 None -2020-06-01T00:00:00 None -2020-06-02T00:00:00 None -2020-06-03T00:00:00 None -2020-06-04T00:00:00 None -2020-06-05T00:00:00 None -2020-06-06T00:00:00 None -2020-06-07T00:00:00 None -2020-06-08T00:00:00 None -2020-06-09T00:00:00 None -2020-06-10T00:00:00 None -2020-06-11T00:00:00 None -2020-06-12T00:00:00 None -2020-06-13T00:00:00 None -2020-06-14T00:00:00 None -2020-06-15T00:00:00 None -2020-06-16T00:00:00 None -2020-06-17T00:00:00 None -2020-06-18T00:00:00 None -2020-06-19T00:00:00 None -2020-06-20T00:00:00 None -2020-06-21T00:00:00 None -2020-06-22T00:00:00 None -2020-06-23T00:00:00 None -2020-06-24T00:00:00 None -2020-06-25T00:00:00 None -2020-06-26T00:00:00 None -2020-06-27T00:00:00 None -2020-06-28T00:00:00 None -2020-06-29T00:00:00 None -2020-06-30T00:00:00 None -2020-07-01T00:00:00 None -2020-07-02T00:00:00 None -2020-07-03T00:00:00 None -2020-07-04T00:00:00 None -2020-07-05T00:00:00 None -2020-07-06T00:00:00 None -2020-07-07T00:00:00 None -2020-07-08T00:00:00 None -2020-07-09T00:00:00 None -2020-07-10T00:00:00 None -2020-07-11T00:00:00 None -2020-07-12T00:00:00 None -2020-07-13T00:00:00 None -2020-07-14T00:00:00 None -2020-07-15T00:00:00 None -2020-07-16T00:00:00 None -2020-07-17T00:00:00 None -2020-07-18T00:00:00 None -2020-07-19T00:00:00 None -2020-07-20T00:00:00 None -2020-07-21T00:00:00 None -2020-07-22T00:00:00 None -2020-07-23T00:00:00 None -2020-07-24T00:00:00 None -2020-07-25T00:00:00 None -2020-07-26T00:00:00 None -2020-07-27T00:00:00 None -2020-07-28T00:00:00 None -2020-07-29T00:00:00 None -2020-07-30T00:00:00 None -2020-07-31T00:00:00 None -2020-08-01T00:00:00 None -2020-08-02T00:00:00 None -2020-08-03T00:00:00 None -2020-08-04T00:00:00 None -2020-08-05T00:00:00 None -2020-08-06T00:00:00 None -2020-08-07T00:00:00 None -2020-08-08T00:00:00 None -2020-08-09T00:00:00 None -2020-08-10T00:00:00 None -2020-08-11T00:00:00 None -2020-08-12T00:00:00 None -2020-08-13T00:00:00 None -2020-08-14T00:00:00 None -2020-08-15T00:00:00 None -2020-08-16T00:00:00 None -2020-08-17T00:00:00 None -2020-08-18T00:00:00 None -2020-08-19T00:00:00 None -2020-08-20T00:00:00 None -2020-08-21T00:00:00 None -2020-08-22T00:00:00 None -2020-08-23T00:00:00 None -2020-08-24T00:00:00 None -2020-08-25T00:00:00 None -2020-08-26T00:00:00 None -2020-08-27T00:00:00 None -2020-08-28T00:00:00 None -2020-08-29T00:00:00 None -2020-08-30T00:00:00 None -2020-08-31T00:00:00 None -2020-09-01T00:00:00 None -2020-09-02T00:00:00 None -2020-09-03T00:00:00 None -2020-09-04T00:00:00 None -2020-09-05T00:00:00 None -2020-09-06T00:00:00 None -2020-09-07T00:00:00 None -2020-09-08T00:00:00 None -2020-09-09T00:00:00 None -2020-09-10T00:00:00 None -2020-09-11T00:00:00 None -2020-09-12T00:00:00 None -2020-09-13T00:00:00 None -2020-09-14T00:00:00 None -2020-09-15T00:00:00 None -2020-09-16T00:00:00 None -2020-09-17T00:00:00 None -2020-09-18T00:00:00 None -2020-09-19T00:00:00 None -2020-09-20T00:00:00 None -2020-09-21T00:00:00 None -2020-09-22T00:00:00 None -2020-09-23T00:00:00 None -2020-09-24T00:00:00 None -2020-09-25T00:00:00 None -2020-09-26T00:00:00 None -2020-09-27T00:00:00 None -2020-09-28T00:00:00 None -2020-09-29T00:00:00 None -2020-09-30T00:00:00 None -2020-10-01T00:00:00 None -2020-10-02T00:00:00 None -2020-10-03T00:00:00 None -2020-10-04T00:00:00 None -2020-10-05T00:00:00 None -2020-10-06T00:00:00 None -2020-10-07T00:00:00 None -2020-10-08T00:00:00 None -2020-10-09T00:00:00 None -2020-10-10T00:00:00 None -2020-10-11T00:00:00 None -2020-10-12T00:00:00 None -2020-10-13T00:00:00 None -2020-10-14T00:00:00 None -2020-10-15T00:00:00 None -2020-10-16T00:00:00 None -2020-10-17T00:00:00 None -2020-10-18T00:00:00 None -2020-10-19T00:00:00 None -2020-10-20T00:00:00 None -2020-10-21T00:00:00 None -2020-10-22T00:00:00 None -2020-10-23T00:00:00 None -2020-10-24T00:00:00 None -2020-10-25T00:00:00 None -2020-10-26T00:00:00 None -2020-10-27T00:00:00 None -2020-10-28T00:00:00 None -2020-10-29T00:00:00 None -2020-10-30T00:00:00 None -2020-10-31T00:00:00 None -2020-11-01T00:00:00 None -2020-11-02T00:00:00 None -2020-11-03T00:00:00 None -2020-11-04T00:00:00 None -2020-11-05T00:00:00 None -2020-11-06T00:00:00 None -2020-11-07T00:00:00 None -2020-11-08T00:00:00 None -2020-11-09T00:00:00 None -2020-11-10T00:00:00 None -2020-11-11T00:00:00 None -2020-11-12T00:00:00 None -2020-11-13T00:00:00 None -2020-11-14T00:00:00 None -2020-11-15T00:00:00 None -2020-11-16T00:00:00 None -2020-11-17T00:00:00 None -2020-11-18T00:00:00 None -2020-11-19T00:00:00 None -2020-11-20T00:00:00 None -2020-11-21T00:00:00 None -2020-11-22T00:00:00 None -2020-11-23T00:00:00 None -2020-11-24T00:00:00 None -2020-11-25T00:00:00 None -2020-11-26T00:00:00 None -2020-11-27T00:00:00 None -2020-11-28T00:00:00 None -2020-11-29T00:00:00 None -2020-11-30T00:00:00 None -2020-12-01T00:00:00 None -2020-12-02T00:00:00 None -2020-12-03T00:00:00 None -2020-12-04T00:00:00 None -2020-12-05T00:00:00 None -2020-12-06T00:00:00 None -2020-12-07T00:00:00 None -2020-12-08T00:00:00 None -2020-12-09T00:00:00 None -2020-12-10T00:00:00 None -2020-12-11T00:00:00 None -2020-12-12T00:00:00 None -2020-12-13T00:00:00 None -2020-12-14T00:00:00 None -2020-12-15T00:00:00 None -2020-12-16T00:00:00 None -2020-12-17T00:00:00 None -2020-12-18T00:00:00 None -2020-12-19T00:00:00 None -2020-12-20T00:00:00 None -2020-12-21T00:00:00 None -2020-12-22T00:00:00 None -2020-12-23T00:00:00 None -2020-12-24T00:00:00 None -2020-12-25T00:00:00 None -2020-12-26T00:00:00 None -2020-12-27T00:00:00 None -2020-12-28T00:00:00 None -2020-12-29T00:00:00 None -2020-12-30T00:00:00 None -2020-12-31T00:00:00 None -2021-01-01T00:00:00 None -2021-01-02T00:00:00 None -2021-01-03T00:00:00 None -2021-01-04T00:00:00 None -2021-01-05T00:00:00 None -2021-01-06T00:00:00 None -2021-01-07T00:00:00 None -2021-01-08T00:00:00 None -2021-01-09T00:00:00 None -2021-01-10T00:00:00 None -2021-01-11T00:00:00 None -2021-01-12T00:00:00 None -2021-01-13T00:00:00 None -2021-01-14T00:00:00 None -2021-01-15T00:00:00 None -2021-01-16T00:00:00 None -2021-01-17T00:00:00 None -2021-01-18T00:00:00 None -2021-01-19T00:00:00 None -2021-01-20T00:00:00 None -2021-01-21T00:00:00 None -2021-01-22T00:00:00 None -2021-01-23T00:00:00 None -2021-01-24T00:00:00 None -2021-01-25T00:00:00 None -2021-01-26T00:00:00 None -2021-01-27T00:00:00 None -2021-01-28T00:00:00 None -2021-01-29T00:00:00 None -2021-01-30T00:00:00 None -2021-01-31T00:00:00 None -2021-02-01T00:00:00 None -2021-02-02T00:00:00 None -2021-02-03T00:00:00 None -2021-02-04T00:00:00 None -2021-02-05T00:00:00 None -2021-02-06T00:00:00 None -2021-02-07T00:00:00 None -2021-02-08T00:00:00 None -2021-02-09T00:00:00 None -2021-02-10T00:00:00 None -2021-02-11T00:00:00 None -2021-02-12T00:00:00 None -2021-02-13T00:00:00 None -2021-02-14T00:00:00 None -2021-02-15T00:00:00 None -2021-02-16T00:00:00 None -2021-02-17T00:00:00 None -2021-02-18T00:00:00 None -2021-02-19T00:00:00 None -2021-02-20T00:00:00 None -2021-02-21T00:00:00 None -2021-02-22T00:00:00 None -2021-02-23T00:00:00 None -2021-02-24T00:00:00 None -2021-02-25T00:00:00 None -2021-02-26T00:00:00 None -2021-02-27T00:00:00 None -2021-02-28T00:00:00 None -2021-03-01T00:00:00 None -2021-03-02T00:00:00 None -2021-03-03T00:00:00 None -2021-03-04T00:00:00 None -2021-03-05T00:00:00 None -2021-03-06T00:00:00 None -2021-03-07T00:00:00 None -2021-03-08T00:00:00 None -2021-03-09T00:00:00 None -2021-03-10T00:00:00 None -2021-03-11T00:00:00 None -2021-03-12T00:00:00 None -2021-03-13T00:00:00 None -2021-03-14T00:00:00 None -2021-03-15T00:00:00 None -2021-03-16T00:00:00 None -2021-03-17T00:00:00 None -2021-03-18T00:00:00 None -2021-03-19T00:00:00 None -2021-03-20T00:00:00 None -2021-03-21T00:00:00 None -2021-03-22T00:00:00 None -2021-03-23T00:00:00 None -2021-03-24T00:00:00 None -2021-03-25T00:00:00 None -2021-03-26T00:00:00 None -2021-03-27T00:00:00 None -2021-03-28T00:00:00 None -2021-03-29T00:00:00 None -2021-03-30T00:00:00 None -2021-03-31T00:00:00 None -2021-04-01T00:00:00 None -2021-04-02T00:00:00 None -2021-04-03T00:00:00 None -2021-04-04T00:00:00 None -2021-04-05T00:00:00 None -2021-04-06T00:00:00 None -2021-04-07T00:00:00 None -2021-04-08T00:00:00 None -2021-04-09T00:00:00 None -2021-04-10T00:00:00 None -2021-04-11T00:00:00 None -2021-04-12T00:00:00 None -2021-04-13T00:00:00 None -2021-04-14T00:00:00 None -2021-04-15T00:00:00 None -2021-04-16T00:00:00 None -2021-04-17T00:00:00 None -2021-04-18T00:00:00 None -2021-04-19T00:00:00 None -2021-04-20T00:00:00 None -2021-04-21T00:00:00 None -2021-04-22T00:00:00 None -2021-04-23T00:00:00 None -2021-04-24T00:00:00 None -2021-04-25T00:00:00 None -2021-04-26T00:00:00 None -2021-04-27T00:00:00 None -2021-04-28T00:00:00 None -2021-04-29T00:00:00 None -2021-04-30T00:00:00 None -2021-05-01T00:00:00 None -2021-05-02T00:00:00 None -2021-05-03T00:00:00 None -2021-05-04T00:00:00 None -2021-05-05T00:00:00 None -2021-05-06T00:00:00 None -2021-05-07T00:00:00 None -2021-05-08T00:00:00 None -2021-05-09T00:00:00 None -2021-05-10T00:00:00 None -2021-05-11T00:00:00 None -2021-05-12T00:00:00 None -2021-05-13T00:00:00 None -2021-05-14T00:00:00 None -2021-05-15T00:00:00 None -2021-05-16T00:00:00 None -2021-05-17T00:00:00 None -2021-05-18T00:00:00 None -2021-05-19T00:00:00 None -2021-05-20T00:00:00 None -2021-05-21T00:00:00 None -2021-05-22T00:00:00 None -2021-05-23T00:00:00 None -2021-05-24T00:00:00 None -2021-05-25T00:00:00 None -2021-05-26T00:00:00 None -2021-05-27T00:00:00 None -2021-05-28T00:00:00 None -2021-05-29T00:00:00 None -2021-05-30T00:00:00 None -2021-05-31T00:00:00 None -2021-06-01T00:00:00 None -2021-06-02T00:00:00 None -2021-06-03T00:00:00 None -2021-06-04T00:00:00 None -2021-06-05T00:00:00 None -2021-06-06T00:00:00 None -2021-06-07T00:00:00 None -2021-06-08T00:00:00 None -2021-06-09T00:00:00 None -2021-06-10T00:00:00 None -2021-06-11T00:00:00 None -2021-06-12T00:00:00 None -2021-06-13T00:00:00 None -2021-06-14T00:00:00 None -2021-06-15T00:00:00 None -2021-06-16T00:00:00 None -2021-06-17T00:00:00 None -2021-06-18T00:00:00 None -2021-06-19T00:00:00 None -2021-06-20T00:00:00 None -2021-06-21T00:00:00 None -2021-06-22T00:00:00 None -2021-06-23T00:00:00 None -2021-06-24T00:00:00 None -2021-06-25T00:00:00 None -2021-06-26T00:00:00 None -2021-06-27T00:00:00 None -2021-06-28T00:00:00 None -2021-06-29T00:00:00 None -2021-06-30T00:00:00 None -2021-07-01T00:00:00 None -2021-07-02T00:00:00 None -2021-07-03T00:00:00 None -2021-07-04T00:00:00 None -2021-07-05T00:00:00 None -2021-07-06T00:00:00 None -2021-07-07T00:00:00 None -2021-07-08T00:00:00 None -2021-07-09T00:00:00 None -2021-07-10T00:00:00 None -2021-07-11T00:00:00 None -2021-07-12T00:00:00 None -2021-07-13T00:00:00 None -2021-07-14T00:00:00 None -2021-07-15T00:00:00 None -2021-07-16T00:00:00 None -2021-07-17T00:00:00 None -2021-07-18T00:00:00 None -2021-07-19T00:00:00 None -2021-07-20T00:00:00 None -2021-07-21T00:00:00 None -2021-07-22T00:00:00 None -2021-07-23T00:00:00 None -2021-07-24T00:00:00 None -2021-07-25T00:00:00 None -2021-07-26T00:00:00 None -2021-07-27T00:00:00 None -2021-07-28T00:00:00 None -2021-07-29T00:00:00 None -2021-07-30T00:00:00 None -2021-07-31T00:00:00 None -2021-08-01T00:00:00 None -2021-08-02T00:00:00 None -2021-08-03T00:00:00 None -2021-08-04T00:00:00 None -2021-08-05T00:00:00 None -2021-08-06T00:00:00 None -2021-08-07T00:00:00 None -2021-08-08T00:00:00 None -2021-08-09T00:00:00 None -2021-08-10T00:00:00 None -2021-08-11T00:00:00 None -2021-08-12T00:00:00 None -2021-08-13T00:00:00 None -2021-08-14T00:00:00 None -2021-08-15T00:00:00 None -2021-08-16T00:00:00 None -2021-08-17T00:00:00 None -2021-08-18T00:00:00 None -2021-08-19T00:00:00 None -2021-08-20T00:00:00 None -2021-08-21T00:00:00 None -2021-08-22T00:00:00 None -2021-08-23T00:00:00 None -2021-08-24T00:00:00 None -2021-08-25T00:00:00 None -2021-08-26T00:00:00 None -2021-08-27T00:00:00 None -2021-08-28T00:00:00 None -2021-08-29T00:00:00 None -2021-08-30T00:00:00 None -2021-08-31T00:00:00 None -2021-09-01T00:00:00 None -2021-09-02T00:00:00 None -2021-09-03T00:00:00 None -2021-09-04T00:00:00 None -2021-09-05T00:00:00 None -2021-09-06T00:00:00 None -2021-09-07T00:00:00 None -2021-09-08T00:00:00 None -2021-09-09T00:00:00 None -2021-09-10T00:00:00 None -2021-09-11T00:00:00 None -2021-09-12T00:00:00 None -2021-09-13T00:00:00 None -2021-09-14T00:00:00 None -2021-09-15T00:00:00 None -2021-09-16T00:00:00 None -2021-09-17T00:00:00 None -2021-09-18T00:00:00 None -2021-09-19T00:00:00 None -2021-09-20T00:00:00 None -2021-09-21T00:00:00 None -2021-09-22T00:00:00 None -2021-09-23T00:00:00 None -2021-09-24T00:00:00 None -2021-09-25T00:00:00 None -2021-09-26T00:00:00 None -2021-09-27T00:00:00 None -2021-09-28T00:00:00 None -2021-09-29T00:00:00 None -2021-09-30T00:00:00 None -2021-10-01T00:00:00 None -2021-10-02T00:00:00 None -2021-10-03T00:00:00 None -2021-10-04T00:00:00 None -2021-10-05T00:00:00 None -2021-10-06T00:00:00 None -2021-10-07T00:00:00 None -2021-10-08T00:00:00 None -2021-10-09T00:00:00 None -2021-10-10T00:00:00 None -2021-10-11T00:00:00 None -2021-10-12T00:00:00 None -2021-10-13T00:00:00 None -2021-10-14T00:00:00 None -2021-10-15T00:00:00 None -2021-10-16T00:00:00 None -2021-10-17T00:00:00 None -2021-10-18T00:00:00 None -2021-10-19T00:00:00 None -2021-10-20T00:00:00 None -2021-10-21T00:00:00 None -2021-10-22T00:00:00 None -2021-10-23T00:00:00 None -2021-10-24T00:00:00 None -2021-10-25T00:00:00 None -2021-10-26T00:00:00 None -2021-10-27T00:00:00 None -2021-10-28T00:00:00 None -2021-10-29T00:00:00 None -2021-10-30T00:00:00 None -2021-10-31T00:00:00 None -2021-11-01T00:00:00 None -2021-11-02T00:00:00 None -2021-11-03T00:00:00 None -2021-11-04T00:00:00 None -2021-11-05T00:00:00 None -2021-11-06T00:00:00 None -2021-11-07T00:00:00 None -2021-11-08T00:00:00 None -2021-11-09T00:00:00 None -2021-11-10T00:00:00 None -2021-11-11T00:00:00 None -2021-11-12T00:00:00 None -2021-11-13T00:00:00 None -2021-11-14T00:00:00 None -2021-11-15T00:00:00 None -2021-11-16T00:00:00 None -2021-11-17T00:00:00 None -2021-11-18T00:00:00 None -2021-11-19T00:00:00 None -2021-11-20T00:00:00 None -2021-11-21T00:00:00 None -2021-11-22T00:00:00 None -2021-11-23T00:00:00 None -2021-11-24T00:00:00 None -2021-11-25T00:00:00 None +metric_time__day bookings_join_to_time_spine +------------------ ----------------------------- diff --git a/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Redshift/test_join_to_time_spine_with_custom_grain_in_group_by__query_output.txt b/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Redshift/test_join_to_time_spine_with_custom_grain_in_group_by__query_output.txt index 6f1e747281..6906a594ac 100644 --- a/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Redshift/test_join_to_time_spine_with_custom_grain_in_group_by__query_output.txt +++ b/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Redshift/test_join_to_time_spine_with_custom_grain_in_group_by__query_output.txt @@ -1,20 +1,10 @@ test_name: test_join_to_time_spine_with_custom_grain_in_group_by test_filename: test_fill_nulls_with_0.py --- -booking__ds__martian_day bookings_join_to_time_spine --------------------------- ----------------------------- -2020-01-01T00:00:00 None -2020-01-02T00:00:00 None -2020-01-03T00:00:00 None -2020-01-04T00:00:00 None -2020-01-05T00:00:00 None -2020-01-06T00:00:00 None -2020-01-07T00:00:00 None -2020-01-08T00:00:00 46 -2020-01-09T00:00:00 None -2020-01-10T00:00:00 None -2020-01-11T00:00:00 None -2020-01-12T00:00:00 None -2020-01-13T00:00:00 None -2020-01-14T00:00:00 None -2020-01-15T00:00:00 None +booking__ds__alien_day bookings_join_to_time_spine +------------------------ ----------------------------- +2020-01-01T00:00:00 None +2020-01-02T00:00:00 31 +2020-01-03T00:00:00 15 +2020-01-04T00:00:00 None +2020-01-05T00:00:00 None diff --git a/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Redshift/test_join_to_timespine_metric_with_custom_granularity_filter__query_output.txt b/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Redshift/test_join_to_timespine_metric_with_custom_granularity_filter__query_output.txt index 1363607ee0..f755f5ad45 100644 --- a/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Redshift/test_join_to_timespine_metric_with_custom_granularity_filter__query_output.txt +++ b/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Redshift/test_join_to_timespine_metric_with_custom_granularity_filter__query_output.txt @@ -1,6 +1,5 @@ test_name: test_join_to_timespine_metric_with_custom_granularity_filter test_filename: test_fill_nulls_with_0.py --- -metric_time__martian_day bookings_join_to_time_spine --------------------------- ----------------------------- -2020-01-08T00:00:00 46 +metric_time__alien_day bookings_join_to_time_spine +------------------------ ----------------------------- diff --git a/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Redshift/test_join_to_timespine_metric_with_custom_granularity_filter_not_in_group_by__query_output.txt b/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Redshift/test_join_to_timespine_metric_with_custom_granularity_filter_not_in_group_by__query_output.txt index c980e19fb0..8452166bf9 100644 --- a/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Redshift/test_join_to_timespine_metric_with_custom_granularity_filter_not_in_group_by__query_output.txt +++ b/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Redshift/test_join_to_timespine_metric_with_custom_granularity_filter_not_in_group_by__query_output.txt @@ -1,1005 +1,5 @@ test_name: test_join_to_timespine_metric_with_custom_granularity_filter_not_in_group_by test_filename: test_fill_nulls_with_0.py --- -metric_time__day bookings_join_to_time_spine -------------------- ----------------------------- -2019-03-02T00:00:00 None -2019-03-03T00:00:00 None -2019-03-04T00:00:00 None -2019-03-05T00:00:00 None -2019-03-06T00:00:00 None -2019-03-07T00:00:00 None -2019-03-08T00:00:00 None -2019-03-09T00:00:00 None -2019-03-10T00:00:00 None -2019-03-11T00:00:00 None -2019-03-12T00:00:00 None -2019-03-13T00:00:00 None -2019-03-14T00:00:00 None -2019-03-15T00:00:00 None -2019-03-16T00:00:00 None -2019-03-17T00:00:00 None -2019-03-18T00:00:00 None -2019-03-19T00:00:00 None -2019-03-20T00:00:00 None -2019-03-21T00:00:00 None -2019-03-22T00:00:00 None -2019-03-23T00:00:00 None -2019-03-24T00:00:00 None -2019-03-25T00:00:00 None -2019-03-26T00:00:00 None -2019-03-27T00:00:00 None -2019-03-28T00:00:00 None -2019-03-29T00:00:00 None -2019-03-30T00:00:00 None -2019-03-31T00:00:00 None -2019-04-01T00:00:00 None -2019-04-02T00:00:00 None -2019-04-03T00:00:00 None -2019-04-04T00:00:00 None -2019-04-05T00:00:00 None -2019-04-06T00:00:00 None -2019-04-07T00:00:00 None -2019-04-08T00:00:00 None -2019-04-09T00:00:00 None -2019-04-10T00:00:00 None -2019-04-11T00:00:00 None -2019-04-12T00:00:00 None -2019-04-13T00:00:00 None -2019-04-14T00:00:00 None -2019-04-15T00:00:00 None -2019-04-16T00:00:00 None -2019-04-17T00:00:00 None -2019-04-18T00:00:00 None -2019-04-19T00:00:00 None -2019-04-20T00:00:00 None -2019-04-21T00:00:00 None -2019-04-22T00:00:00 None -2019-04-23T00:00:00 None -2019-04-24T00:00:00 None -2019-04-25T00:00:00 None -2019-04-26T00:00:00 None -2019-04-27T00:00:00 None -2019-04-28T00:00:00 None -2019-04-29T00:00:00 None -2019-04-30T00:00:00 None -2019-05-01T00:00:00 None -2019-05-02T00:00:00 None -2019-05-03T00:00:00 None -2019-05-04T00:00:00 None -2019-05-05T00:00:00 None -2019-05-06T00:00:00 None -2019-05-07T00:00:00 None -2019-05-08T00:00:00 None -2019-05-09T00:00:00 None -2019-05-10T00:00:00 None -2019-05-11T00:00:00 None -2019-05-12T00:00:00 None -2019-05-13T00:00:00 None -2019-05-14T00:00:00 None -2019-05-15T00:00:00 None -2019-05-16T00:00:00 None -2019-05-17T00:00:00 None -2019-05-18T00:00:00 None -2019-05-19T00:00:00 None -2019-05-20T00:00:00 None -2019-05-21T00:00:00 None -2019-05-22T00:00:00 None -2019-05-23T00:00:00 None -2019-05-24T00:00:00 None -2019-05-25T00:00:00 None -2019-05-26T00:00:00 None -2019-05-27T00:00:00 None -2019-05-28T00:00:00 None -2019-05-29T00:00:00 None -2019-05-30T00:00:00 None -2019-05-31T00:00:00 None -2019-06-01T00:00:00 None -2019-06-02T00:00:00 None -2019-06-03T00:00:00 None -2019-06-04T00:00:00 None -2019-06-05T00:00:00 None -2019-06-06T00:00:00 None -2019-06-07T00:00:00 None -2019-06-08T00:00:00 None -2019-06-09T00:00:00 None -2019-06-10T00:00:00 None -2019-06-11T00:00:00 None -2019-06-12T00:00:00 None -2019-06-13T00:00:00 None -2019-06-14T00:00:00 None -2019-06-15T00:00:00 None -2019-06-16T00:00:00 None -2019-06-17T00:00:00 None -2019-06-18T00:00:00 None -2019-06-19T00:00:00 None -2019-06-20T00:00:00 None -2019-06-21T00:00:00 None -2019-06-22T00:00:00 None -2019-06-23T00:00:00 None -2019-06-24T00:00:00 None -2019-06-25T00:00:00 None -2019-06-26T00:00:00 None -2019-06-27T00:00:00 None -2019-06-28T00:00:00 None -2019-06-29T00:00:00 None -2019-06-30T00:00:00 None -2019-07-01T00:00:00 None -2019-07-02T00:00:00 None -2019-07-03T00:00:00 None -2019-07-04T00:00:00 None -2019-07-05T00:00:00 None -2019-07-06T00:00:00 None -2019-07-07T00:00:00 None -2019-07-08T00:00:00 None -2019-07-09T00:00:00 None -2019-07-10T00:00:00 None -2019-07-11T00:00:00 None -2019-07-12T00:00:00 None -2019-07-13T00:00:00 None -2019-07-14T00:00:00 None -2019-07-15T00:00:00 None -2019-07-16T00:00:00 None -2019-07-17T00:00:00 None -2019-07-18T00:00:00 None -2019-07-19T00:00:00 None -2019-07-20T00:00:00 None -2019-07-21T00:00:00 None -2019-07-22T00:00:00 None -2019-07-23T00:00:00 None -2019-07-24T00:00:00 None -2019-07-25T00:00:00 None -2019-07-26T00:00:00 None -2019-07-27T00:00:00 None -2019-07-28T00:00:00 None -2019-07-29T00:00:00 None -2019-07-30T00:00:00 None -2019-07-31T00:00:00 None -2019-08-01T00:00:00 None -2019-08-02T00:00:00 None -2019-08-03T00:00:00 None -2019-08-04T00:00:00 None -2019-08-05T00:00:00 None -2019-08-06T00:00:00 None -2019-08-07T00:00:00 None -2019-08-08T00:00:00 None -2019-08-09T00:00:00 None -2019-08-10T00:00:00 None -2019-08-11T00:00:00 None -2019-08-12T00:00:00 None -2019-08-13T00:00:00 None -2019-08-14T00:00:00 None -2019-08-15T00:00:00 None -2019-08-16T00:00:00 None -2019-08-17T00:00:00 None -2019-08-18T00:00:00 None -2019-08-19T00:00:00 None -2019-08-20T00:00:00 None -2019-08-21T00:00:00 None -2019-08-22T00:00:00 None -2019-08-23T00:00:00 None -2019-08-24T00:00:00 None -2019-08-25T00:00:00 None -2019-08-26T00:00:00 None -2019-08-27T00:00:00 None -2019-08-28T00:00:00 None -2019-08-29T00:00:00 None -2019-08-30T00:00:00 None -2019-08-31T00:00:00 None -2019-09-01T00:00:00 None -2019-09-02T00:00:00 None -2019-09-03T00:00:00 None -2019-09-04T00:00:00 None -2019-09-05T00:00:00 None -2019-09-06T00:00:00 None -2019-09-07T00:00:00 None -2019-09-08T00:00:00 None -2019-09-09T00:00:00 None -2019-09-10T00:00:00 None -2019-09-11T00:00:00 None -2019-09-12T00:00:00 None -2019-09-13T00:00:00 None -2019-09-14T00:00:00 None -2019-09-15T00:00:00 None -2019-09-16T00:00:00 None -2019-09-17T00:00:00 None -2019-09-18T00:00:00 None -2019-09-19T00:00:00 None -2019-09-20T00:00:00 None -2019-09-21T00:00:00 None -2019-09-22T00:00:00 None -2019-09-23T00:00:00 None -2019-09-24T00:00:00 None -2019-09-25T00:00:00 None -2019-09-26T00:00:00 None -2019-09-27T00:00:00 None -2019-09-28T00:00:00 None -2019-09-29T00:00:00 None -2019-09-30T00:00:00 None -2019-10-01T00:00:00 None -2019-10-02T00:00:00 None -2019-10-03T00:00:00 None -2019-10-04T00:00:00 None -2019-10-05T00:00:00 None -2019-10-06T00:00:00 None -2019-10-07T00:00:00 None -2019-10-08T00:00:00 None -2019-10-09T00:00:00 None -2019-10-10T00:00:00 None -2019-10-11T00:00:00 None -2019-10-12T00:00:00 None -2019-10-13T00:00:00 None -2019-10-14T00:00:00 None -2019-10-15T00:00:00 None -2019-10-16T00:00:00 None -2019-10-17T00:00:00 None -2019-10-18T00:00:00 None -2019-10-19T00:00:00 None -2019-10-20T00:00:00 None -2019-10-21T00:00:00 None -2019-10-22T00:00:00 None -2019-10-23T00:00:00 None -2019-10-24T00:00:00 None -2019-10-25T00:00:00 None -2019-10-26T00:00:00 None -2019-10-27T00:00:00 None -2019-10-28T00:00:00 None -2019-10-29T00:00:00 None -2019-10-30T00:00:00 None -2019-10-31T00:00:00 None -2019-11-01T00:00:00 None -2019-11-02T00:00:00 None -2019-11-03T00:00:00 None -2019-11-04T00:00:00 None -2019-11-05T00:00:00 None -2019-11-06T00:00:00 None -2019-11-07T00:00:00 None -2019-11-08T00:00:00 None -2019-11-09T00:00:00 None -2019-11-10T00:00:00 None -2019-11-11T00:00:00 None -2019-11-12T00:00:00 None -2019-11-13T00:00:00 None -2019-11-14T00:00:00 None -2019-11-15T00:00:00 None -2019-11-16T00:00:00 None -2019-11-17T00:00:00 None -2019-11-18T00:00:00 None -2019-11-19T00:00:00 None -2019-11-20T00:00:00 None -2019-11-21T00:00:00 None -2019-11-22T00:00:00 None -2019-11-23T00:00:00 None -2019-11-24T00:00:00 None -2019-11-25T00:00:00 None -2019-11-26T00:00:00 None -2019-11-27T00:00:00 None -2019-11-28T00:00:00 None -2019-11-29T00:00:00 None -2019-11-30T00:00:00 None -2019-12-01T00:00:00 1 -2019-12-02T00:00:00 None -2019-12-03T00:00:00 None -2019-12-04T00:00:00 None -2019-12-05T00:00:00 None -2019-12-06T00:00:00 None -2019-12-07T00:00:00 None -2019-12-08T00:00:00 None -2019-12-09T00:00:00 None -2019-12-10T00:00:00 None -2019-12-11T00:00:00 None -2019-12-12T00:00:00 None -2019-12-13T00:00:00 None -2019-12-14T00:00:00 None -2019-12-15T00:00:00 None -2019-12-16T00:00:00 None -2019-12-17T00:00:00 None -2019-12-18T00:00:00 10 -2019-12-19T00:00:00 18 -2019-12-20T00:00:00 2 -2019-12-21T00:00:00 None -2019-12-22T00:00:00 None -2019-12-23T00:00:00 None -2019-12-24T00:00:00 None -2019-12-25T00:00:00 None -2019-12-26T00:00:00 None -2019-12-27T00:00:00 None -2019-12-28T00:00:00 None -2019-12-29T00:00:00 None -2019-12-30T00:00:00 None -2019-12-31T00:00:00 None -2020-01-01T00:00:00 5 -2020-01-02T00:00:00 9 -2020-01-03T00:00:00 1 -2020-01-04T00:00:00 None -2020-01-05T00:00:00 None -2020-01-06T00:00:00 None -2020-01-07T00:00:00 None -2020-01-08T00:00:00 None -2020-01-09T00:00:00 None -2020-01-10T00:00:00 None -2020-01-11T00:00:00 None -2020-01-12T00:00:00 None -2020-01-13T00:00:00 None -2020-01-14T00:00:00 None -2020-01-15T00:00:00 None -2020-01-16T00:00:00 None -2020-01-17T00:00:00 None -2020-01-18T00:00:00 None -2020-01-19T00:00:00 None -2020-01-20T00:00:00 None -2020-01-21T00:00:00 None -2020-01-22T00:00:00 None -2020-01-23T00:00:00 None -2020-01-24T00:00:00 None -2020-01-25T00:00:00 None -2020-01-26T00:00:00 None -2020-01-27T00:00:00 None -2020-01-28T00:00:00 None -2020-01-29T00:00:00 None -2020-01-30T00:00:00 None -2020-01-31T00:00:00 None -2020-02-01T00:00:00 None -2020-02-02T00:00:00 None -2020-02-03T00:00:00 None -2020-02-04T00:00:00 None -2020-02-05T00:00:00 None -2020-02-06T00:00:00 None -2020-02-07T00:00:00 None -2020-02-08T00:00:00 None -2020-02-09T00:00:00 None -2020-02-10T00:00:00 None -2020-02-11T00:00:00 None -2020-02-12T00:00:00 None -2020-02-13T00:00:00 None -2020-02-14T00:00:00 None -2020-02-15T00:00:00 None -2020-02-16T00:00:00 None -2020-02-17T00:00:00 None -2020-02-18T00:00:00 None -2020-02-19T00:00:00 None -2020-02-20T00:00:00 None -2020-02-21T00:00:00 None -2020-02-22T00:00:00 None -2020-02-23T00:00:00 None -2020-02-24T00:00:00 None -2020-02-25T00:00:00 None -2020-02-26T00:00:00 None -2020-02-27T00:00:00 None -2020-02-28T00:00:00 None -2020-02-29T00:00:00 None -2020-03-01T00:00:00 None -2020-03-02T00:00:00 None -2020-03-03T00:00:00 None -2020-03-04T00:00:00 None -2020-03-05T00:00:00 None -2020-03-06T00:00:00 None -2020-03-07T00:00:00 None -2020-03-08T00:00:00 None -2020-03-09T00:00:00 None -2020-03-10T00:00:00 None -2020-03-11T00:00:00 None -2020-03-12T00:00:00 None -2020-03-13T00:00:00 None -2020-03-14T00:00:00 None -2020-03-15T00:00:00 None -2020-03-16T00:00:00 None -2020-03-17T00:00:00 None -2020-03-18T00:00:00 None -2020-03-19T00:00:00 None -2020-03-20T00:00:00 None -2020-03-21T00:00:00 None -2020-03-22T00:00:00 None -2020-03-23T00:00:00 None -2020-03-24T00:00:00 None -2020-03-25T00:00:00 None -2020-03-26T00:00:00 None -2020-03-27T00:00:00 None -2020-03-28T00:00:00 None -2020-03-29T00:00:00 None -2020-03-30T00:00:00 None -2020-03-31T00:00:00 None -2020-04-01T00:00:00 None -2020-04-02T00:00:00 None -2020-04-03T00:00:00 None -2020-04-04T00:00:00 None -2020-04-05T00:00:00 None -2020-04-06T00:00:00 None -2020-04-07T00:00:00 None -2020-04-08T00:00:00 None -2020-04-09T00:00:00 None -2020-04-10T00:00:00 None -2020-04-11T00:00:00 None -2020-04-12T00:00:00 None -2020-04-13T00:00:00 None -2020-04-14T00:00:00 None -2020-04-15T00:00:00 None -2020-04-16T00:00:00 None -2020-04-17T00:00:00 None -2020-04-18T00:00:00 None -2020-04-19T00:00:00 None -2020-04-20T00:00:00 None -2020-04-21T00:00:00 None -2020-04-22T00:00:00 None -2020-04-23T00:00:00 None -2020-04-24T00:00:00 None -2020-04-25T00:00:00 None -2020-04-26T00:00:00 None -2020-04-27T00:00:00 None -2020-04-28T00:00:00 None -2020-04-29T00:00:00 None -2020-04-30T00:00:00 None -2020-05-01T00:00:00 None -2020-05-02T00:00:00 None -2020-05-03T00:00:00 None -2020-05-04T00:00:00 None -2020-05-05T00:00:00 None -2020-05-06T00:00:00 None -2020-05-07T00:00:00 None -2020-05-08T00:00:00 None -2020-05-09T00:00:00 None -2020-05-10T00:00:00 None -2020-05-11T00:00:00 None -2020-05-12T00:00:00 None -2020-05-13T00:00:00 None -2020-05-14T00:00:00 None -2020-05-15T00:00:00 None -2020-05-16T00:00:00 None -2020-05-17T00:00:00 None -2020-05-18T00:00:00 None -2020-05-19T00:00:00 None -2020-05-20T00:00:00 None -2020-05-21T00:00:00 None -2020-05-22T00:00:00 None -2020-05-23T00:00:00 None -2020-05-24T00:00:00 None -2020-05-25T00:00:00 None -2020-05-26T00:00:00 None -2020-05-27T00:00:00 None -2020-05-28T00:00:00 None -2020-05-29T00:00:00 None -2020-05-30T00:00:00 None -2020-05-31T00:00:00 None -2020-06-01T00:00:00 None -2020-06-02T00:00:00 None -2020-06-03T00:00:00 None -2020-06-04T00:00:00 None -2020-06-05T00:00:00 None -2020-06-06T00:00:00 None -2020-06-07T00:00:00 None -2020-06-08T00:00:00 None -2020-06-09T00:00:00 None -2020-06-10T00:00:00 None -2020-06-11T00:00:00 None -2020-06-12T00:00:00 None -2020-06-13T00:00:00 None -2020-06-14T00:00:00 None -2020-06-15T00:00:00 None -2020-06-16T00:00:00 None -2020-06-17T00:00:00 None -2020-06-18T00:00:00 None -2020-06-19T00:00:00 None -2020-06-20T00:00:00 None -2020-06-21T00:00:00 None -2020-06-22T00:00:00 None -2020-06-23T00:00:00 None -2020-06-24T00:00:00 None -2020-06-25T00:00:00 None -2020-06-26T00:00:00 None -2020-06-27T00:00:00 None -2020-06-28T00:00:00 None -2020-06-29T00:00:00 None -2020-06-30T00:00:00 None -2020-07-01T00:00:00 None -2020-07-02T00:00:00 None -2020-07-03T00:00:00 None -2020-07-04T00:00:00 None -2020-07-05T00:00:00 None -2020-07-06T00:00:00 None -2020-07-07T00:00:00 None -2020-07-08T00:00:00 None -2020-07-09T00:00:00 None -2020-07-10T00:00:00 None -2020-07-11T00:00:00 None -2020-07-12T00:00:00 None -2020-07-13T00:00:00 None -2020-07-14T00:00:00 None -2020-07-15T00:00:00 None -2020-07-16T00:00:00 None -2020-07-17T00:00:00 None -2020-07-18T00:00:00 None -2020-07-19T00:00:00 None -2020-07-20T00:00:00 None -2020-07-21T00:00:00 None -2020-07-22T00:00:00 None -2020-07-23T00:00:00 None -2020-07-24T00:00:00 None -2020-07-25T00:00:00 None -2020-07-26T00:00:00 None -2020-07-27T00:00:00 None -2020-07-28T00:00:00 None -2020-07-29T00:00:00 None -2020-07-30T00:00:00 None -2020-07-31T00:00:00 None -2020-08-01T00:00:00 None -2020-08-02T00:00:00 None -2020-08-03T00:00:00 None -2020-08-04T00:00:00 None -2020-08-05T00:00:00 None -2020-08-06T00:00:00 None -2020-08-07T00:00:00 None -2020-08-08T00:00:00 None -2020-08-09T00:00:00 None -2020-08-10T00:00:00 None -2020-08-11T00:00:00 None -2020-08-12T00:00:00 None -2020-08-13T00:00:00 None -2020-08-14T00:00:00 None -2020-08-15T00:00:00 None -2020-08-16T00:00:00 None -2020-08-17T00:00:00 None -2020-08-18T00:00:00 None -2020-08-19T00:00:00 None -2020-08-20T00:00:00 None -2020-08-21T00:00:00 None -2020-08-22T00:00:00 None -2020-08-23T00:00:00 None -2020-08-24T00:00:00 None -2020-08-25T00:00:00 None -2020-08-26T00:00:00 None -2020-08-27T00:00:00 None -2020-08-28T00:00:00 None -2020-08-29T00:00:00 None -2020-08-30T00:00:00 None -2020-08-31T00:00:00 None -2020-09-01T00:00:00 None -2020-09-02T00:00:00 None -2020-09-03T00:00:00 None -2020-09-04T00:00:00 None -2020-09-05T00:00:00 None -2020-09-06T00:00:00 None -2020-09-07T00:00:00 None -2020-09-08T00:00:00 None -2020-09-09T00:00:00 None -2020-09-10T00:00:00 None -2020-09-11T00:00:00 None -2020-09-12T00:00:00 None -2020-09-13T00:00:00 None -2020-09-14T00:00:00 None -2020-09-15T00:00:00 None -2020-09-16T00:00:00 None -2020-09-17T00:00:00 None -2020-09-18T00:00:00 None -2020-09-19T00:00:00 None -2020-09-20T00:00:00 None -2020-09-21T00:00:00 None -2020-09-22T00:00:00 None -2020-09-23T00:00:00 None -2020-09-24T00:00:00 None -2020-09-25T00:00:00 None -2020-09-26T00:00:00 None -2020-09-27T00:00:00 None -2020-09-28T00:00:00 None -2020-09-29T00:00:00 None -2020-09-30T00:00:00 None -2020-10-01T00:00:00 None -2020-10-02T00:00:00 None -2020-10-03T00:00:00 None -2020-10-04T00:00:00 None -2020-10-05T00:00:00 None -2020-10-06T00:00:00 None -2020-10-07T00:00:00 None -2020-10-08T00:00:00 None -2020-10-09T00:00:00 None -2020-10-10T00:00:00 None -2020-10-11T00:00:00 None -2020-10-12T00:00:00 None -2020-10-13T00:00:00 None -2020-10-14T00:00:00 None -2020-10-15T00:00:00 None -2020-10-16T00:00:00 None -2020-10-17T00:00:00 None -2020-10-18T00:00:00 None -2020-10-19T00:00:00 None -2020-10-20T00:00:00 None -2020-10-21T00:00:00 None -2020-10-22T00:00:00 None -2020-10-23T00:00:00 None -2020-10-24T00:00:00 None -2020-10-25T00:00:00 None -2020-10-26T00:00:00 None -2020-10-27T00:00:00 None -2020-10-28T00:00:00 None -2020-10-29T00:00:00 None -2020-10-30T00:00:00 None -2020-10-31T00:00:00 None -2020-11-01T00:00:00 None -2020-11-02T00:00:00 None -2020-11-03T00:00:00 None -2020-11-04T00:00:00 None -2020-11-05T00:00:00 None -2020-11-06T00:00:00 None -2020-11-07T00:00:00 None -2020-11-08T00:00:00 None -2020-11-09T00:00:00 None -2020-11-10T00:00:00 None -2020-11-11T00:00:00 None -2020-11-12T00:00:00 None -2020-11-13T00:00:00 None -2020-11-14T00:00:00 None -2020-11-15T00:00:00 None -2020-11-16T00:00:00 None -2020-11-17T00:00:00 None -2020-11-18T00:00:00 None -2020-11-19T00:00:00 None -2020-11-20T00:00:00 None -2020-11-21T00:00:00 None -2020-11-22T00:00:00 None -2020-11-23T00:00:00 None -2020-11-24T00:00:00 None -2020-11-25T00:00:00 None -2020-11-26T00:00:00 None -2020-11-27T00:00:00 None -2020-11-28T00:00:00 None -2020-11-29T00:00:00 None -2020-11-30T00:00:00 None -2020-12-01T00:00:00 None -2020-12-02T00:00:00 None -2020-12-03T00:00:00 None -2020-12-04T00:00:00 None -2020-12-05T00:00:00 None -2020-12-06T00:00:00 None -2020-12-07T00:00:00 None -2020-12-08T00:00:00 None -2020-12-09T00:00:00 None -2020-12-10T00:00:00 None -2020-12-11T00:00:00 None -2020-12-12T00:00:00 None -2020-12-13T00:00:00 None -2020-12-14T00:00:00 None -2020-12-15T00:00:00 None -2020-12-16T00:00:00 None -2020-12-17T00:00:00 None -2020-12-18T00:00:00 None -2020-12-19T00:00:00 None -2020-12-20T00:00:00 None -2020-12-21T00:00:00 None -2020-12-22T00:00:00 None -2020-12-23T00:00:00 None -2020-12-24T00:00:00 None -2020-12-25T00:00:00 None -2020-12-26T00:00:00 None -2020-12-27T00:00:00 None -2020-12-28T00:00:00 None -2020-12-29T00:00:00 None -2020-12-30T00:00:00 None -2020-12-31T00:00:00 None -2021-01-01T00:00:00 None -2021-01-02T00:00:00 None -2021-01-03T00:00:00 None -2021-01-04T00:00:00 None -2021-01-05T00:00:00 None -2021-01-06T00:00:00 None -2021-01-07T00:00:00 None -2021-01-08T00:00:00 None -2021-01-09T00:00:00 None -2021-01-10T00:00:00 None -2021-01-11T00:00:00 None -2021-01-12T00:00:00 None -2021-01-13T00:00:00 None -2021-01-14T00:00:00 None -2021-01-15T00:00:00 None -2021-01-16T00:00:00 None -2021-01-17T00:00:00 None -2021-01-18T00:00:00 None -2021-01-19T00:00:00 None -2021-01-20T00:00:00 None -2021-01-21T00:00:00 None -2021-01-22T00:00:00 None -2021-01-23T00:00:00 None -2021-01-24T00:00:00 None -2021-01-25T00:00:00 None -2021-01-26T00:00:00 None -2021-01-27T00:00:00 None -2021-01-28T00:00:00 None -2021-01-29T00:00:00 None -2021-01-30T00:00:00 None -2021-01-31T00:00:00 None -2021-02-01T00:00:00 None -2021-02-02T00:00:00 None -2021-02-03T00:00:00 None -2021-02-04T00:00:00 None -2021-02-05T00:00:00 None -2021-02-06T00:00:00 None -2021-02-07T00:00:00 None -2021-02-08T00:00:00 None -2021-02-09T00:00:00 None -2021-02-10T00:00:00 None -2021-02-11T00:00:00 None -2021-02-12T00:00:00 None -2021-02-13T00:00:00 None -2021-02-14T00:00:00 None -2021-02-15T00:00:00 None -2021-02-16T00:00:00 None -2021-02-17T00:00:00 None -2021-02-18T00:00:00 None -2021-02-19T00:00:00 None -2021-02-20T00:00:00 None -2021-02-21T00:00:00 None -2021-02-22T00:00:00 None -2021-02-23T00:00:00 None -2021-02-24T00:00:00 None -2021-02-25T00:00:00 None -2021-02-26T00:00:00 None -2021-02-27T00:00:00 None -2021-02-28T00:00:00 None -2021-03-01T00:00:00 None -2021-03-02T00:00:00 None -2021-03-03T00:00:00 None -2021-03-04T00:00:00 None -2021-03-05T00:00:00 None -2021-03-06T00:00:00 None -2021-03-07T00:00:00 None -2021-03-08T00:00:00 None -2021-03-09T00:00:00 None -2021-03-10T00:00:00 None -2021-03-11T00:00:00 None -2021-03-12T00:00:00 None -2021-03-13T00:00:00 None -2021-03-14T00:00:00 None -2021-03-15T00:00:00 None -2021-03-16T00:00:00 None -2021-03-17T00:00:00 None -2021-03-18T00:00:00 None -2021-03-19T00:00:00 None -2021-03-20T00:00:00 None -2021-03-21T00:00:00 None -2021-03-22T00:00:00 None -2021-03-23T00:00:00 None -2021-03-24T00:00:00 None -2021-03-25T00:00:00 None -2021-03-26T00:00:00 None -2021-03-27T00:00:00 None -2021-03-28T00:00:00 None -2021-03-29T00:00:00 None -2021-03-30T00:00:00 None -2021-03-31T00:00:00 None -2021-04-01T00:00:00 None -2021-04-02T00:00:00 None -2021-04-03T00:00:00 None -2021-04-04T00:00:00 None -2021-04-05T00:00:00 None -2021-04-06T00:00:00 None -2021-04-07T00:00:00 None -2021-04-08T00:00:00 None -2021-04-09T00:00:00 None -2021-04-10T00:00:00 None -2021-04-11T00:00:00 None -2021-04-12T00:00:00 None -2021-04-13T00:00:00 None -2021-04-14T00:00:00 None -2021-04-15T00:00:00 None -2021-04-16T00:00:00 None -2021-04-17T00:00:00 None -2021-04-18T00:00:00 None -2021-04-19T00:00:00 None -2021-04-20T00:00:00 None -2021-04-21T00:00:00 None -2021-04-22T00:00:00 None -2021-04-23T00:00:00 None -2021-04-24T00:00:00 None -2021-04-25T00:00:00 None -2021-04-26T00:00:00 None -2021-04-27T00:00:00 None -2021-04-28T00:00:00 None -2021-04-29T00:00:00 None -2021-04-30T00:00:00 None -2021-05-01T00:00:00 None -2021-05-02T00:00:00 None -2021-05-03T00:00:00 None -2021-05-04T00:00:00 None -2021-05-05T00:00:00 None -2021-05-06T00:00:00 None -2021-05-07T00:00:00 None -2021-05-08T00:00:00 None -2021-05-09T00:00:00 None -2021-05-10T00:00:00 None -2021-05-11T00:00:00 None -2021-05-12T00:00:00 None -2021-05-13T00:00:00 None -2021-05-14T00:00:00 None -2021-05-15T00:00:00 None -2021-05-16T00:00:00 None -2021-05-17T00:00:00 None -2021-05-18T00:00:00 None -2021-05-19T00:00:00 None -2021-05-20T00:00:00 None -2021-05-21T00:00:00 None -2021-05-22T00:00:00 None -2021-05-23T00:00:00 None -2021-05-24T00:00:00 None -2021-05-25T00:00:00 None -2021-05-26T00:00:00 None -2021-05-27T00:00:00 None -2021-05-28T00:00:00 None -2021-05-29T00:00:00 None -2021-05-30T00:00:00 None -2021-05-31T00:00:00 None -2021-06-01T00:00:00 None -2021-06-02T00:00:00 None -2021-06-03T00:00:00 None -2021-06-04T00:00:00 None -2021-06-05T00:00:00 None -2021-06-06T00:00:00 None -2021-06-07T00:00:00 None -2021-06-08T00:00:00 None -2021-06-09T00:00:00 None -2021-06-10T00:00:00 None -2021-06-11T00:00:00 None -2021-06-12T00:00:00 None -2021-06-13T00:00:00 None -2021-06-14T00:00:00 None -2021-06-15T00:00:00 None -2021-06-16T00:00:00 None -2021-06-17T00:00:00 None -2021-06-18T00:00:00 None -2021-06-19T00:00:00 None -2021-06-20T00:00:00 None -2021-06-21T00:00:00 None -2021-06-22T00:00:00 None -2021-06-23T00:00:00 None -2021-06-24T00:00:00 None -2021-06-25T00:00:00 None -2021-06-26T00:00:00 None -2021-06-27T00:00:00 None -2021-06-28T00:00:00 None -2021-06-29T00:00:00 None -2021-06-30T00:00:00 None -2021-07-01T00:00:00 None -2021-07-02T00:00:00 None -2021-07-03T00:00:00 None -2021-07-04T00:00:00 None -2021-07-05T00:00:00 None -2021-07-06T00:00:00 None -2021-07-07T00:00:00 None -2021-07-08T00:00:00 None -2021-07-09T00:00:00 None -2021-07-10T00:00:00 None -2021-07-11T00:00:00 None -2021-07-12T00:00:00 None -2021-07-13T00:00:00 None -2021-07-14T00:00:00 None -2021-07-15T00:00:00 None -2021-07-16T00:00:00 None -2021-07-17T00:00:00 None -2021-07-18T00:00:00 None -2021-07-19T00:00:00 None -2021-07-20T00:00:00 None -2021-07-21T00:00:00 None -2021-07-22T00:00:00 None -2021-07-23T00:00:00 None -2021-07-24T00:00:00 None -2021-07-25T00:00:00 None -2021-07-26T00:00:00 None -2021-07-27T00:00:00 None -2021-07-28T00:00:00 None -2021-07-29T00:00:00 None -2021-07-30T00:00:00 None -2021-07-31T00:00:00 None -2021-08-01T00:00:00 None -2021-08-02T00:00:00 None -2021-08-03T00:00:00 None -2021-08-04T00:00:00 None -2021-08-05T00:00:00 None -2021-08-06T00:00:00 None -2021-08-07T00:00:00 None -2021-08-08T00:00:00 None -2021-08-09T00:00:00 None -2021-08-10T00:00:00 None -2021-08-11T00:00:00 None -2021-08-12T00:00:00 None -2021-08-13T00:00:00 None -2021-08-14T00:00:00 None -2021-08-15T00:00:00 None -2021-08-16T00:00:00 None -2021-08-17T00:00:00 None -2021-08-18T00:00:00 None -2021-08-19T00:00:00 None -2021-08-20T00:00:00 None -2021-08-21T00:00:00 None -2021-08-22T00:00:00 None -2021-08-23T00:00:00 None -2021-08-24T00:00:00 None -2021-08-25T00:00:00 None -2021-08-26T00:00:00 None -2021-08-27T00:00:00 None -2021-08-28T00:00:00 None -2021-08-29T00:00:00 None -2021-08-30T00:00:00 None -2021-08-31T00:00:00 None -2021-09-01T00:00:00 None -2021-09-02T00:00:00 None -2021-09-03T00:00:00 None -2021-09-04T00:00:00 None -2021-09-05T00:00:00 None -2021-09-06T00:00:00 None -2021-09-07T00:00:00 None -2021-09-08T00:00:00 None -2021-09-09T00:00:00 None -2021-09-10T00:00:00 None -2021-09-11T00:00:00 None -2021-09-12T00:00:00 None -2021-09-13T00:00:00 None -2021-09-14T00:00:00 None -2021-09-15T00:00:00 None -2021-09-16T00:00:00 None -2021-09-17T00:00:00 None -2021-09-18T00:00:00 None -2021-09-19T00:00:00 None -2021-09-20T00:00:00 None -2021-09-21T00:00:00 None -2021-09-22T00:00:00 None -2021-09-23T00:00:00 None -2021-09-24T00:00:00 None -2021-09-25T00:00:00 None -2021-09-26T00:00:00 None -2021-09-27T00:00:00 None -2021-09-28T00:00:00 None -2021-09-29T00:00:00 None -2021-09-30T00:00:00 None -2021-10-01T00:00:00 None -2021-10-02T00:00:00 None -2021-10-03T00:00:00 None -2021-10-04T00:00:00 None -2021-10-05T00:00:00 None -2021-10-06T00:00:00 None -2021-10-07T00:00:00 None -2021-10-08T00:00:00 None -2021-10-09T00:00:00 None -2021-10-10T00:00:00 None -2021-10-11T00:00:00 None -2021-10-12T00:00:00 None -2021-10-13T00:00:00 None -2021-10-14T00:00:00 None -2021-10-15T00:00:00 None -2021-10-16T00:00:00 None -2021-10-17T00:00:00 None -2021-10-18T00:00:00 None -2021-10-19T00:00:00 None -2021-10-20T00:00:00 None -2021-10-21T00:00:00 None -2021-10-22T00:00:00 None -2021-10-23T00:00:00 None -2021-10-24T00:00:00 None -2021-10-25T00:00:00 None -2021-10-26T00:00:00 None -2021-10-27T00:00:00 None -2021-10-28T00:00:00 None -2021-10-29T00:00:00 None -2021-10-30T00:00:00 None -2021-10-31T00:00:00 None -2021-11-01T00:00:00 None -2021-11-02T00:00:00 None -2021-11-03T00:00:00 None -2021-11-04T00:00:00 None -2021-11-05T00:00:00 None -2021-11-06T00:00:00 None -2021-11-07T00:00:00 None -2021-11-08T00:00:00 None -2021-11-09T00:00:00 None -2021-11-10T00:00:00 None -2021-11-11T00:00:00 None -2021-11-12T00:00:00 None -2021-11-13T00:00:00 None -2021-11-14T00:00:00 None -2021-11-15T00:00:00 None -2021-11-16T00:00:00 None -2021-11-17T00:00:00 None -2021-11-18T00:00:00 None -2021-11-19T00:00:00 None -2021-11-20T00:00:00 None -2021-11-21T00:00:00 None -2021-11-22T00:00:00 None -2021-11-23T00:00:00 None -2021-11-24T00:00:00 None -2021-11-25T00:00:00 None +metric_time__day bookings_join_to_time_spine +------------------ ----------------------------- diff --git a/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Snowflake/test_join_to_time_spine_with_custom_grain_in_group_by__query_output.txt b/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Snowflake/test_join_to_time_spine_with_custom_grain_in_group_by__query_output.txt index 17fd809eb6..81ee5a4b32 100644 --- a/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Snowflake/test_join_to_time_spine_with_custom_grain_in_group_by__query_output.txt +++ b/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Snowflake/test_join_to_time_spine_with_custom_grain_in_group_by__query_output.txt @@ -1,20 +1,10 @@ test_name: test_join_to_time_spine_with_custom_grain_in_group_by test_filename: test_fill_nulls_with_0.py --- -BOOKING__DS__MARTIAN_DAY BOOKINGS_JOIN_TO_TIME_SPINE --------------------------- ----------------------------- -2020-01-01T00:00:00 None -2020-01-02T00:00:00 None -2020-01-03T00:00:00 None -2020-01-04T00:00:00 None -2020-01-05T00:00:00 None -2020-01-06T00:00:00 None -2020-01-07T00:00:00 None -2020-01-08T00:00:00 46 -2020-01-09T00:00:00 None -2020-01-10T00:00:00 None -2020-01-11T00:00:00 None -2020-01-12T00:00:00 None -2020-01-13T00:00:00 None -2020-01-14T00:00:00 None -2020-01-15T00:00:00 None +BOOKING__DS__ALIEN_DAY BOOKINGS_JOIN_TO_TIME_SPINE +------------------------ ----------------------------- +2020-01-01T00:00:00 None +2020-01-02T00:00:00 31 +2020-01-03T00:00:00 15 +2020-01-04T00:00:00 None +2020-01-05T00:00:00 None diff --git a/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Snowflake/test_join_to_timespine_metric_with_custom_granularity_filter__query_output.txt b/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Snowflake/test_join_to_timespine_metric_with_custom_granularity_filter__query_output.txt index 64dffa1ece..d7cf89ba1b 100644 --- a/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Snowflake/test_join_to_timespine_metric_with_custom_granularity_filter__query_output.txt +++ b/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Snowflake/test_join_to_timespine_metric_with_custom_granularity_filter__query_output.txt @@ -1,6 +1,5 @@ test_name: test_join_to_timespine_metric_with_custom_granularity_filter test_filename: test_fill_nulls_with_0.py --- -METRIC_TIME__MARTIAN_DAY BOOKINGS_JOIN_TO_TIME_SPINE --------------------------- ----------------------------- -2020-01-08T00:00:00 46 +METRIC_TIME__ALIEN_DAY BOOKINGS_JOIN_TO_TIME_SPINE +------------------------ ----------------------------- diff --git a/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Snowflake/test_join_to_timespine_metric_with_custom_granularity_filter_not_in_group_by__query_output.txt b/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Snowflake/test_join_to_timespine_metric_with_custom_granularity_filter_not_in_group_by__query_output.txt index d5ed44764d..d9004aad2d 100644 --- a/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Snowflake/test_join_to_timespine_metric_with_custom_granularity_filter_not_in_group_by__query_output.txt +++ b/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Snowflake/test_join_to_timespine_metric_with_custom_granularity_filter_not_in_group_by__query_output.txt @@ -1,1005 +1,5 @@ test_name: test_join_to_timespine_metric_with_custom_granularity_filter_not_in_group_by test_filename: test_fill_nulls_with_0.py --- -METRIC_TIME__DAY BOOKINGS_JOIN_TO_TIME_SPINE -------------------- ----------------------------- -2019-03-02T00:00:00 None -2019-03-03T00:00:00 None -2019-03-04T00:00:00 None -2019-03-05T00:00:00 None -2019-03-06T00:00:00 None -2019-03-07T00:00:00 None -2019-03-08T00:00:00 None -2019-03-09T00:00:00 None -2019-03-10T00:00:00 None -2019-03-11T00:00:00 None -2019-03-12T00:00:00 None -2019-03-13T00:00:00 None -2019-03-14T00:00:00 None -2019-03-15T00:00:00 None -2019-03-16T00:00:00 None -2019-03-17T00:00:00 None -2019-03-18T00:00:00 None -2019-03-19T00:00:00 None -2019-03-20T00:00:00 None -2019-03-21T00:00:00 None -2019-03-22T00:00:00 None -2019-03-23T00:00:00 None -2019-03-24T00:00:00 None -2019-03-25T00:00:00 None -2019-03-26T00:00:00 None -2019-03-27T00:00:00 None -2019-03-28T00:00:00 None -2019-03-29T00:00:00 None -2019-03-30T00:00:00 None -2019-03-31T00:00:00 None -2019-04-01T00:00:00 None -2019-04-02T00:00:00 None -2019-04-03T00:00:00 None -2019-04-04T00:00:00 None -2019-04-05T00:00:00 None -2019-04-06T00:00:00 None -2019-04-07T00:00:00 None -2019-04-08T00:00:00 None -2019-04-09T00:00:00 None -2019-04-10T00:00:00 None -2019-04-11T00:00:00 None -2019-04-12T00:00:00 None -2019-04-13T00:00:00 None -2019-04-14T00:00:00 None -2019-04-15T00:00:00 None -2019-04-16T00:00:00 None -2019-04-17T00:00:00 None -2019-04-18T00:00:00 None -2019-04-19T00:00:00 None -2019-04-20T00:00:00 None -2019-04-21T00:00:00 None -2019-04-22T00:00:00 None -2019-04-23T00:00:00 None -2019-04-24T00:00:00 None -2019-04-25T00:00:00 None -2019-04-26T00:00:00 None -2019-04-27T00:00:00 None -2019-04-28T00:00:00 None -2019-04-29T00:00:00 None -2019-04-30T00:00:00 None -2019-05-01T00:00:00 None -2019-05-02T00:00:00 None -2019-05-03T00:00:00 None -2019-05-04T00:00:00 None -2019-05-05T00:00:00 None -2019-05-06T00:00:00 None -2019-05-07T00:00:00 None -2019-05-08T00:00:00 None -2019-05-09T00:00:00 None -2019-05-10T00:00:00 None -2019-05-11T00:00:00 None -2019-05-12T00:00:00 None -2019-05-13T00:00:00 None -2019-05-14T00:00:00 None -2019-05-15T00:00:00 None -2019-05-16T00:00:00 None -2019-05-17T00:00:00 None -2019-05-18T00:00:00 None -2019-05-19T00:00:00 None -2019-05-20T00:00:00 None -2019-05-21T00:00:00 None -2019-05-22T00:00:00 None -2019-05-23T00:00:00 None -2019-05-24T00:00:00 None -2019-05-25T00:00:00 None -2019-05-26T00:00:00 None -2019-05-27T00:00:00 None -2019-05-28T00:00:00 None -2019-05-29T00:00:00 None -2019-05-30T00:00:00 None -2019-05-31T00:00:00 None -2019-06-01T00:00:00 None -2019-06-02T00:00:00 None -2019-06-03T00:00:00 None -2019-06-04T00:00:00 None -2019-06-05T00:00:00 None -2019-06-06T00:00:00 None -2019-06-07T00:00:00 None -2019-06-08T00:00:00 None -2019-06-09T00:00:00 None -2019-06-10T00:00:00 None -2019-06-11T00:00:00 None -2019-06-12T00:00:00 None -2019-06-13T00:00:00 None -2019-06-14T00:00:00 None -2019-06-15T00:00:00 None -2019-06-16T00:00:00 None -2019-06-17T00:00:00 None -2019-06-18T00:00:00 None -2019-06-19T00:00:00 None -2019-06-20T00:00:00 None -2019-06-21T00:00:00 None -2019-06-22T00:00:00 None -2019-06-23T00:00:00 None -2019-06-24T00:00:00 None -2019-06-25T00:00:00 None -2019-06-26T00:00:00 None -2019-06-27T00:00:00 None -2019-06-28T00:00:00 None -2019-06-29T00:00:00 None -2019-06-30T00:00:00 None -2019-07-01T00:00:00 None -2019-07-02T00:00:00 None -2019-07-03T00:00:00 None -2019-07-04T00:00:00 None -2019-07-05T00:00:00 None -2019-07-06T00:00:00 None -2019-07-07T00:00:00 None -2019-07-08T00:00:00 None -2019-07-09T00:00:00 None -2019-07-10T00:00:00 None -2019-07-11T00:00:00 None -2019-07-12T00:00:00 None -2019-07-13T00:00:00 None -2019-07-14T00:00:00 None -2019-07-15T00:00:00 None -2019-07-16T00:00:00 None -2019-07-17T00:00:00 None -2019-07-18T00:00:00 None -2019-07-19T00:00:00 None -2019-07-20T00:00:00 None -2019-07-21T00:00:00 None -2019-07-22T00:00:00 None -2019-07-23T00:00:00 None -2019-07-24T00:00:00 None -2019-07-25T00:00:00 None -2019-07-26T00:00:00 None -2019-07-27T00:00:00 None -2019-07-28T00:00:00 None -2019-07-29T00:00:00 None -2019-07-30T00:00:00 None -2019-07-31T00:00:00 None -2019-08-01T00:00:00 None -2019-08-02T00:00:00 None -2019-08-03T00:00:00 None -2019-08-04T00:00:00 None -2019-08-05T00:00:00 None -2019-08-06T00:00:00 None -2019-08-07T00:00:00 None -2019-08-08T00:00:00 None -2019-08-09T00:00:00 None -2019-08-10T00:00:00 None -2019-08-11T00:00:00 None -2019-08-12T00:00:00 None -2019-08-13T00:00:00 None -2019-08-14T00:00:00 None -2019-08-15T00:00:00 None -2019-08-16T00:00:00 None -2019-08-17T00:00:00 None -2019-08-18T00:00:00 None -2019-08-19T00:00:00 None -2019-08-20T00:00:00 None -2019-08-21T00:00:00 None -2019-08-22T00:00:00 None -2019-08-23T00:00:00 None -2019-08-24T00:00:00 None -2019-08-25T00:00:00 None -2019-08-26T00:00:00 None -2019-08-27T00:00:00 None -2019-08-28T00:00:00 None -2019-08-29T00:00:00 None -2019-08-30T00:00:00 None -2019-08-31T00:00:00 None -2019-09-01T00:00:00 None -2019-09-02T00:00:00 None -2019-09-03T00:00:00 None -2019-09-04T00:00:00 None -2019-09-05T00:00:00 None -2019-09-06T00:00:00 None -2019-09-07T00:00:00 None -2019-09-08T00:00:00 None -2019-09-09T00:00:00 None -2019-09-10T00:00:00 None -2019-09-11T00:00:00 None -2019-09-12T00:00:00 None -2019-09-13T00:00:00 None -2019-09-14T00:00:00 None -2019-09-15T00:00:00 None -2019-09-16T00:00:00 None -2019-09-17T00:00:00 None -2019-09-18T00:00:00 None -2019-09-19T00:00:00 None -2019-09-20T00:00:00 None -2019-09-21T00:00:00 None -2019-09-22T00:00:00 None -2019-09-23T00:00:00 None -2019-09-24T00:00:00 None -2019-09-25T00:00:00 None -2019-09-26T00:00:00 None -2019-09-27T00:00:00 None -2019-09-28T00:00:00 None -2019-09-29T00:00:00 None -2019-09-30T00:00:00 None -2019-10-01T00:00:00 None -2019-10-02T00:00:00 None -2019-10-03T00:00:00 None -2019-10-04T00:00:00 None -2019-10-05T00:00:00 None -2019-10-06T00:00:00 None -2019-10-07T00:00:00 None -2019-10-08T00:00:00 None -2019-10-09T00:00:00 None -2019-10-10T00:00:00 None -2019-10-11T00:00:00 None -2019-10-12T00:00:00 None -2019-10-13T00:00:00 None -2019-10-14T00:00:00 None -2019-10-15T00:00:00 None -2019-10-16T00:00:00 None -2019-10-17T00:00:00 None -2019-10-18T00:00:00 None -2019-10-19T00:00:00 None -2019-10-20T00:00:00 None -2019-10-21T00:00:00 None -2019-10-22T00:00:00 None -2019-10-23T00:00:00 None -2019-10-24T00:00:00 None -2019-10-25T00:00:00 None -2019-10-26T00:00:00 None -2019-10-27T00:00:00 None -2019-10-28T00:00:00 None -2019-10-29T00:00:00 None -2019-10-30T00:00:00 None -2019-10-31T00:00:00 None -2019-11-01T00:00:00 None -2019-11-02T00:00:00 None -2019-11-03T00:00:00 None -2019-11-04T00:00:00 None -2019-11-05T00:00:00 None -2019-11-06T00:00:00 None -2019-11-07T00:00:00 None -2019-11-08T00:00:00 None -2019-11-09T00:00:00 None -2019-11-10T00:00:00 None -2019-11-11T00:00:00 None -2019-11-12T00:00:00 None -2019-11-13T00:00:00 None -2019-11-14T00:00:00 None -2019-11-15T00:00:00 None -2019-11-16T00:00:00 None -2019-11-17T00:00:00 None -2019-11-18T00:00:00 None -2019-11-19T00:00:00 None -2019-11-20T00:00:00 None -2019-11-21T00:00:00 None -2019-11-22T00:00:00 None -2019-11-23T00:00:00 None -2019-11-24T00:00:00 None -2019-11-25T00:00:00 None -2019-11-26T00:00:00 None -2019-11-27T00:00:00 None -2019-11-28T00:00:00 None -2019-11-29T00:00:00 None -2019-11-30T00:00:00 None -2019-12-01T00:00:00 1 -2019-12-02T00:00:00 None -2019-12-03T00:00:00 None -2019-12-04T00:00:00 None -2019-12-05T00:00:00 None -2019-12-06T00:00:00 None -2019-12-07T00:00:00 None -2019-12-08T00:00:00 None -2019-12-09T00:00:00 None -2019-12-10T00:00:00 None -2019-12-11T00:00:00 None -2019-12-12T00:00:00 None -2019-12-13T00:00:00 None -2019-12-14T00:00:00 None -2019-12-15T00:00:00 None -2019-12-16T00:00:00 None -2019-12-17T00:00:00 None -2019-12-18T00:00:00 10 -2019-12-19T00:00:00 18 -2019-12-20T00:00:00 2 -2019-12-21T00:00:00 None -2019-12-22T00:00:00 None -2019-12-23T00:00:00 None -2019-12-24T00:00:00 None -2019-12-25T00:00:00 None -2019-12-26T00:00:00 None -2019-12-27T00:00:00 None -2019-12-28T00:00:00 None -2019-12-29T00:00:00 None -2019-12-30T00:00:00 None -2019-12-31T00:00:00 None -2020-01-01T00:00:00 5 -2020-01-02T00:00:00 9 -2020-01-03T00:00:00 1 -2020-01-04T00:00:00 None -2020-01-05T00:00:00 None -2020-01-06T00:00:00 None -2020-01-07T00:00:00 None -2020-01-08T00:00:00 None -2020-01-09T00:00:00 None -2020-01-10T00:00:00 None -2020-01-11T00:00:00 None -2020-01-12T00:00:00 None -2020-01-13T00:00:00 None -2020-01-14T00:00:00 None -2020-01-15T00:00:00 None -2020-01-16T00:00:00 None -2020-01-17T00:00:00 None -2020-01-18T00:00:00 None -2020-01-19T00:00:00 None -2020-01-20T00:00:00 None -2020-01-21T00:00:00 None -2020-01-22T00:00:00 None -2020-01-23T00:00:00 None -2020-01-24T00:00:00 None -2020-01-25T00:00:00 None -2020-01-26T00:00:00 None -2020-01-27T00:00:00 None -2020-01-28T00:00:00 None -2020-01-29T00:00:00 None -2020-01-30T00:00:00 None -2020-01-31T00:00:00 None -2020-02-01T00:00:00 None -2020-02-02T00:00:00 None -2020-02-03T00:00:00 None -2020-02-04T00:00:00 None -2020-02-05T00:00:00 None -2020-02-06T00:00:00 None -2020-02-07T00:00:00 None -2020-02-08T00:00:00 None -2020-02-09T00:00:00 None -2020-02-10T00:00:00 None -2020-02-11T00:00:00 None -2020-02-12T00:00:00 None -2020-02-13T00:00:00 None -2020-02-14T00:00:00 None -2020-02-15T00:00:00 None -2020-02-16T00:00:00 None -2020-02-17T00:00:00 None -2020-02-18T00:00:00 None -2020-02-19T00:00:00 None -2020-02-20T00:00:00 None -2020-02-21T00:00:00 None -2020-02-22T00:00:00 None -2020-02-23T00:00:00 None -2020-02-24T00:00:00 None -2020-02-25T00:00:00 None -2020-02-26T00:00:00 None -2020-02-27T00:00:00 None -2020-02-28T00:00:00 None -2020-02-29T00:00:00 None -2020-03-01T00:00:00 None -2020-03-02T00:00:00 None -2020-03-03T00:00:00 None -2020-03-04T00:00:00 None -2020-03-05T00:00:00 None -2020-03-06T00:00:00 None -2020-03-07T00:00:00 None -2020-03-08T00:00:00 None -2020-03-09T00:00:00 None -2020-03-10T00:00:00 None -2020-03-11T00:00:00 None -2020-03-12T00:00:00 None -2020-03-13T00:00:00 None -2020-03-14T00:00:00 None -2020-03-15T00:00:00 None -2020-03-16T00:00:00 None -2020-03-17T00:00:00 None -2020-03-18T00:00:00 None -2020-03-19T00:00:00 None -2020-03-20T00:00:00 None -2020-03-21T00:00:00 None -2020-03-22T00:00:00 None -2020-03-23T00:00:00 None -2020-03-24T00:00:00 None -2020-03-25T00:00:00 None -2020-03-26T00:00:00 None -2020-03-27T00:00:00 None -2020-03-28T00:00:00 None -2020-03-29T00:00:00 None -2020-03-30T00:00:00 None -2020-03-31T00:00:00 None -2020-04-01T00:00:00 None -2020-04-02T00:00:00 None -2020-04-03T00:00:00 None -2020-04-04T00:00:00 None -2020-04-05T00:00:00 None -2020-04-06T00:00:00 None -2020-04-07T00:00:00 None -2020-04-08T00:00:00 None -2020-04-09T00:00:00 None -2020-04-10T00:00:00 None -2020-04-11T00:00:00 None -2020-04-12T00:00:00 None -2020-04-13T00:00:00 None -2020-04-14T00:00:00 None -2020-04-15T00:00:00 None -2020-04-16T00:00:00 None -2020-04-17T00:00:00 None -2020-04-18T00:00:00 None -2020-04-19T00:00:00 None -2020-04-20T00:00:00 None -2020-04-21T00:00:00 None -2020-04-22T00:00:00 None -2020-04-23T00:00:00 None -2020-04-24T00:00:00 None -2020-04-25T00:00:00 None -2020-04-26T00:00:00 None -2020-04-27T00:00:00 None -2020-04-28T00:00:00 None -2020-04-29T00:00:00 None -2020-04-30T00:00:00 None -2020-05-01T00:00:00 None -2020-05-02T00:00:00 None -2020-05-03T00:00:00 None -2020-05-04T00:00:00 None -2020-05-05T00:00:00 None -2020-05-06T00:00:00 None -2020-05-07T00:00:00 None -2020-05-08T00:00:00 None -2020-05-09T00:00:00 None -2020-05-10T00:00:00 None -2020-05-11T00:00:00 None -2020-05-12T00:00:00 None -2020-05-13T00:00:00 None -2020-05-14T00:00:00 None -2020-05-15T00:00:00 None -2020-05-16T00:00:00 None -2020-05-17T00:00:00 None -2020-05-18T00:00:00 None -2020-05-19T00:00:00 None -2020-05-20T00:00:00 None -2020-05-21T00:00:00 None -2020-05-22T00:00:00 None -2020-05-23T00:00:00 None -2020-05-24T00:00:00 None -2020-05-25T00:00:00 None -2020-05-26T00:00:00 None -2020-05-27T00:00:00 None -2020-05-28T00:00:00 None -2020-05-29T00:00:00 None -2020-05-30T00:00:00 None -2020-05-31T00:00:00 None -2020-06-01T00:00:00 None -2020-06-02T00:00:00 None -2020-06-03T00:00:00 None -2020-06-04T00:00:00 None -2020-06-05T00:00:00 None -2020-06-06T00:00:00 None -2020-06-07T00:00:00 None -2020-06-08T00:00:00 None -2020-06-09T00:00:00 None -2020-06-10T00:00:00 None -2020-06-11T00:00:00 None -2020-06-12T00:00:00 None -2020-06-13T00:00:00 None -2020-06-14T00:00:00 None -2020-06-15T00:00:00 None -2020-06-16T00:00:00 None -2020-06-17T00:00:00 None -2020-06-18T00:00:00 None -2020-06-19T00:00:00 None -2020-06-20T00:00:00 None -2020-06-21T00:00:00 None -2020-06-22T00:00:00 None -2020-06-23T00:00:00 None -2020-06-24T00:00:00 None -2020-06-25T00:00:00 None -2020-06-26T00:00:00 None -2020-06-27T00:00:00 None -2020-06-28T00:00:00 None -2020-06-29T00:00:00 None -2020-06-30T00:00:00 None -2020-07-01T00:00:00 None -2020-07-02T00:00:00 None -2020-07-03T00:00:00 None -2020-07-04T00:00:00 None -2020-07-05T00:00:00 None -2020-07-06T00:00:00 None -2020-07-07T00:00:00 None -2020-07-08T00:00:00 None -2020-07-09T00:00:00 None -2020-07-10T00:00:00 None -2020-07-11T00:00:00 None -2020-07-12T00:00:00 None -2020-07-13T00:00:00 None -2020-07-14T00:00:00 None -2020-07-15T00:00:00 None -2020-07-16T00:00:00 None -2020-07-17T00:00:00 None -2020-07-18T00:00:00 None -2020-07-19T00:00:00 None -2020-07-20T00:00:00 None -2020-07-21T00:00:00 None -2020-07-22T00:00:00 None -2020-07-23T00:00:00 None -2020-07-24T00:00:00 None -2020-07-25T00:00:00 None -2020-07-26T00:00:00 None -2020-07-27T00:00:00 None -2020-07-28T00:00:00 None -2020-07-29T00:00:00 None -2020-07-30T00:00:00 None -2020-07-31T00:00:00 None -2020-08-01T00:00:00 None -2020-08-02T00:00:00 None -2020-08-03T00:00:00 None -2020-08-04T00:00:00 None -2020-08-05T00:00:00 None -2020-08-06T00:00:00 None -2020-08-07T00:00:00 None -2020-08-08T00:00:00 None -2020-08-09T00:00:00 None -2020-08-10T00:00:00 None -2020-08-11T00:00:00 None -2020-08-12T00:00:00 None -2020-08-13T00:00:00 None -2020-08-14T00:00:00 None -2020-08-15T00:00:00 None -2020-08-16T00:00:00 None -2020-08-17T00:00:00 None -2020-08-18T00:00:00 None -2020-08-19T00:00:00 None -2020-08-20T00:00:00 None -2020-08-21T00:00:00 None -2020-08-22T00:00:00 None -2020-08-23T00:00:00 None -2020-08-24T00:00:00 None -2020-08-25T00:00:00 None -2020-08-26T00:00:00 None -2020-08-27T00:00:00 None -2020-08-28T00:00:00 None -2020-08-29T00:00:00 None -2020-08-30T00:00:00 None -2020-08-31T00:00:00 None -2020-09-01T00:00:00 None -2020-09-02T00:00:00 None -2020-09-03T00:00:00 None -2020-09-04T00:00:00 None -2020-09-05T00:00:00 None -2020-09-06T00:00:00 None -2020-09-07T00:00:00 None -2020-09-08T00:00:00 None -2020-09-09T00:00:00 None -2020-09-10T00:00:00 None -2020-09-11T00:00:00 None -2020-09-12T00:00:00 None -2020-09-13T00:00:00 None -2020-09-14T00:00:00 None -2020-09-15T00:00:00 None -2020-09-16T00:00:00 None -2020-09-17T00:00:00 None -2020-09-18T00:00:00 None -2020-09-19T00:00:00 None -2020-09-20T00:00:00 None -2020-09-21T00:00:00 None -2020-09-22T00:00:00 None -2020-09-23T00:00:00 None -2020-09-24T00:00:00 None -2020-09-25T00:00:00 None -2020-09-26T00:00:00 None -2020-09-27T00:00:00 None -2020-09-28T00:00:00 None -2020-09-29T00:00:00 None -2020-09-30T00:00:00 None -2020-10-01T00:00:00 None -2020-10-02T00:00:00 None -2020-10-03T00:00:00 None -2020-10-04T00:00:00 None -2020-10-05T00:00:00 None -2020-10-06T00:00:00 None -2020-10-07T00:00:00 None -2020-10-08T00:00:00 None -2020-10-09T00:00:00 None -2020-10-10T00:00:00 None -2020-10-11T00:00:00 None -2020-10-12T00:00:00 None -2020-10-13T00:00:00 None -2020-10-14T00:00:00 None -2020-10-15T00:00:00 None -2020-10-16T00:00:00 None -2020-10-17T00:00:00 None -2020-10-18T00:00:00 None -2020-10-19T00:00:00 None -2020-10-20T00:00:00 None -2020-10-21T00:00:00 None -2020-10-22T00:00:00 None -2020-10-23T00:00:00 None -2020-10-24T00:00:00 None -2020-10-25T00:00:00 None -2020-10-26T00:00:00 None -2020-10-27T00:00:00 None -2020-10-28T00:00:00 None -2020-10-29T00:00:00 None -2020-10-30T00:00:00 None -2020-10-31T00:00:00 None -2020-11-01T00:00:00 None -2020-11-02T00:00:00 None -2020-11-03T00:00:00 None -2020-11-04T00:00:00 None -2020-11-05T00:00:00 None -2020-11-06T00:00:00 None -2020-11-07T00:00:00 None -2020-11-08T00:00:00 None -2020-11-09T00:00:00 None -2020-11-10T00:00:00 None -2020-11-11T00:00:00 None -2020-11-12T00:00:00 None -2020-11-13T00:00:00 None -2020-11-14T00:00:00 None -2020-11-15T00:00:00 None -2020-11-16T00:00:00 None -2020-11-17T00:00:00 None -2020-11-18T00:00:00 None -2020-11-19T00:00:00 None -2020-11-20T00:00:00 None -2020-11-21T00:00:00 None -2020-11-22T00:00:00 None -2020-11-23T00:00:00 None -2020-11-24T00:00:00 None -2020-11-25T00:00:00 None -2020-11-26T00:00:00 None -2020-11-27T00:00:00 None -2020-11-28T00:00:00 None -2020-11-29T00:00:00 None -2020-11-30T00:00:00 None -2020-12-01T00:00:00 None -2020-12-02T00:00:00 None -2020-12-03T00:00:00 None -2020-12-04T00:00:00 None -2020-12-05T00:00:00 None -2020-12-06T00:00:00 None -2020-12-07T00:00:00 None -2020-12-08T00:00:00 None -2020-12-09T00:00:00 None -2020-12-10T00:00:00 None -2020-12-11T00:00:00 None -2020-12-12T00:00:00 None -2020-12-13T00:00:00 None -2020-12-14T00:00:00 None -2020-12-15T00:00:00 None -2020-12-16T00:00:00 None -2020-12-17T00:00:00 None -2020-12-18T00:00:00 None -2020-12-19T00:00:00 None -2020-12-20T00:00:00 None -2020-12-21T00:00:00 None -2020-12-22T00:00:00 None -2020-12-23T00:00:00 None -2020-12-24T00:00:00 None -2020-12-25T00:00:00 None -2020-12-26T00:00:00 None -2020-12-27T00:00:00 None -2020-12-28T00:00:00 None -2020-12-29T00:00:00 None -2020-12-30T00:00:00 None -2020-12-31T00:00:00 None -2021-01-01T00:00:00 None -2021-01-02T00:00:00 None -2021-01-03T00:00:00 None -2021-01-04T00:00:00 None -2021-01-05T00:00:00 None -2021-01-06T00:00:00 None -2021-01-07T00:00:00 None -2021-01-08T00:00:00 None -2021-01-09T00:00:00 None -2021-01-10T00:00:00 None -2021-01-11T00:00:00 None -2021-01-12T00:00:00 None -2021-01-13T00:00:00 None -2021-01-14T00:00:00 None -2021-01-15T00:00:00 None -2021-01-16T00:00:00 None -2021-01-17T00:00:00 None -2021-01-18T00:00:00 None -2021-01-19T00:00:00 None -2021-01-20T00:00:00 None -2021-01-21T00:00:00 None -2021-01-22T00:00:00 None -2021-01-23T00:00:00 None -2021-01-24T00:00:00 None -2021-01-25T00:00:00 None -2021-01-26T00:00:00 None -2021-01-27T00:00:00 None -2021-01-28T00:00:00 None -2021-01-29T00:00:00 None -2021-01-30T00:00:00 None -2021-01-31T00:00:00 None -2021-02-01T00:00:00 None -2021-02-02T00:00:00 None -2021-02-03T00:00:00 None -2021-02-04T00:00:00 None -2021-02-05T00:00:00 None -2021-02-06T00:00:00 None -2021-02-07T00:00:00 None -2021-02-08T00:00:00 None -2021-02-09T00:00:00 None -2021-02-10T00:00:00 None -2021-02-11T00:00:00 None -2021-02-12T00:00:00 None -2021-02-13T00:00:00 None -2021-02-14T00:00:00 None -2021-02-15T00:00:00 None -2021-02-16T00:00:00 None -2021-02-17T00:00:00 None -2021-02-18T00:00:00 None -2021-02-19T00:00:00 None -2021-02-20T00:00:00 None -2021-02-21T00:00:00 None -2021-02-22T00:00:00 None -2021-02-23T00:00:00 None -2021-02-24T00:00:00 None -2021-02-25T00:00:00 None -2021-02-26T00:00:00 None -2021-02-27T00:00:00 None -2021-02-28T00:00:00 None -2021-03-01T00:00:00 None -2021-03-02T00:00:00 None -2021-03-03T00:00:00 None -2021-03-04T00:00:00 None -2021-03-05T00:00:00 None -2021-03-06T00:00:00 None -2021-03-07T00:00:00 None -2021-03-08T00:00:00 None -2021-03-09T00:00:00 None -2021-03-10T00:00:00 None -2021-03-11T00:00:00 None -2021-03-12T00:00:00 None -2021-03-13T00:00:00 None -2021-03-14T00:00:00 None -2021-03-15T00:00:00 None -2021-03-16T00:00:00 None -2021-03-17T00:00:00 None -2021-03-18T00:00:00 None -2021-03-19T00:00:00 None -2021-03-20T00:00:00 None -2021-03-21T00:00:00 None -2021-03-22T00:00:00 None -2021-03-23T00:00:00 None -2021-03-24T00:00:00 None -2021-03-25T00:00:00 None -2021-03-26T00:00:00 None -2021-03-27T00:00:00 None -2021-03-28T00:00:00 None -2021-03-29T00:00:00 None -2021-03-30T00:00:00 None -2021-03-31T00:00:00 None -2021-04-01T00:00:00 None -2021-04-02T00:00:00 None -2021-04-03T00:00:00 None -2021-04-04T00:00:00 None -2021-04-05T00:00:00 None -2021-04-06T00:00:00 None -2021-04-07T00:00:00 None -2021-04-08T00:00:00 None -2021-04-09T00:00:00 None -2021-04-10T00:00:00 None -2021-04-11T00:00:00 None -2021-04-12T00:00:00 None -2021-04-13T00:00:00 None -2021-04-14T00:00:00 None -2021-04-15T00:00:00 None -2021-04-16T00:00:00 None -2021-04-17T00:00:00 None -2021-04-18T00:00:00 None -2021-04-19T00:00:00 None -2021-04-20T00:00:00 None -2021-04-21T00:00:00 None -2021-04-22T00:00:00 None -2021-04-23T00:00:00 None -2021-04-24T00:00:00 None -2021-04-25T00:00:00 None -2021-04-26T00:00:00 None -2021-04-27T00:00:00 None -2021-04-28T00:00:00 None -2021-04-29T00:00:00 None -2021-04-30T00:00:00 None -2021-05-01T00:00:00 None -2021-05-02T00:00:00 None -2021-05-03T00:00:00 None -2021-05-04T00:00:00 None -2021-05-05T00:00:00 None -2021-05-06T00:00:00 None -2021-05-07T00:00:00 None -2021-05-08T00:00:00 None -2021-05-09T00:00:00 None -2021-05-10T00:00:00 None -2021-05-11T00:00:00 None -2021-05-12T00:00:00 None -2021-05-13T00:00:00 None -2021-05-14T00:00:00 None -2021-05-15T00:00:00 None -2021-05-16T00:00:00 None -2021-05-17T00:00:00 None -2021-05-18T00:00:00 None -2021-05-19T00:00:00 None -2021-05-20T00:00:00 None -2021-05-21T00:00:00 None -2021-05-22T00:00:00 None -2021-05-23T00:00:00 None -2021-05-24T00:00:00 None -2021-05-25T00:00:00 None -2021-05-26T00:00:00 None -2021-05-27T00:00:00 None -2021-05-28T00:00:00 None -2021-05-29T00:00:00 None -2021-05-30T00:00:00 None -2021-05-31T00:00:00 None -2021-06-01T00:00:00 None -2021-06-02T00:00:00 None -2021-06-03T00:00:00 None -2021-06-04T00:00:00 None -2021-06-05T00:00:00 None -2021-06-06T00:00:00 None -2021-06-07T00:00:00 None -2021-06-08T00:00:00 None -2021-06-09T00:00:00 None -2021-06-10T00:00:00 None -2021-06-11T00:00:00 None -2021-06-12T00:00:00 None -2021-06-13T00:00:00 None -2021-06-14T00:00:00 None -2021-06-15T00:00:00 None -2021-06-16T00:00:00 None -2021-06-17T00:00:00 None -2021-06-18T00:00:00 None -2021-06-19T00:00:00 None -2021-06-20T00:00:00 None -2021-06-21T00:00:00 None -2021-06-22T00:00:00 None -2021-06-23T00:00:00 None -2021-06-24T00:00:00 None -2021-06-25T00:00:00 None -2021-06-26T00:00:00 None -2021-06-27T00:00:00 None -2021-06-28T00:00:00 None -2021-06-29T00:00:00 None -2021-06-30T00:00:00 None -2021-07-01T00:00:00 None -2021-07-02T00:00:00 None -2021-07-03T00:00:00 None -2021-07-04T00:00:00 None -2021-07-05T00:00:00 None -2021-07-06T00:00:00 None -2021-07-07T00:00:00 None -2021-07-08T00:00:00 None -2021-07-09T00:00:00 None -2021-07-10T00:00:00 None -2021-07-11T00:00:00 None -2021-07-12T00:00:00 None -2021-07-13T00:00:00 None -2021-07-14T00:00:00 None -2021-07-15T00:00:00 None -2021-07-16T00:00:00 None -2021-07-17T00:00:00 None -2021-07-18T00:00:00 None -2021-07-19T00:00:00 None -2021-07-20T00:00:00 None -2021-07-21T00:00:00 None -2021-07-22T00:00:00 None -2021-07-23T00:00:00 None -2021-07-24T00:00:00 None -2021-07-25T00:00:00 None -2021-07-26T00:00:00 None -2021-07-27T00:00:00 None -2021-07-28T00:00:00 None -2021-07-29T00:00:00 None -2021-07-30T00:00:00 None -2021-07-31T00:00:00 None -2021-08-01T00:00:00 None -2021-08-02T00:00:00 None -2021-08-03T00:00:00 None -2021-08-04T00:00:00 None -2021-08-05T00:00:00 None -2021-08-06T00:00:00 None -2021-08-07T00:00:00 None -2021-08-08T00:00:00 None -2021-08-09T00:00:00 None -2021-08-10T00:00:00 None -2021-08-11T00:00:00 None -2021-08-12T00:00:00 None -2021-08-13T00:00:00 None -2021-08-14T00:00:00 None -2021-08-15T00:00:00 None -2021-08-16T00:00:00 None -2021-08-17T00:00:00 None -2021-08-18T00:00:00 None -2021-08-19T00:00:00 None -2021-08-20T00:00:00 None -2021-08-21T00:00:00 None -2021-08-22T00:00:00 None -2021-08-23T00:00:00 None -2021-08-24T00:00:00 None -2021-08-25T00:00:00 None -2021-08-26T00:00:00 None -2021-08-27T00:00:00 None -2021-08-28T00:00:00 None -2021-08-29T00:00:00 None -2021-08-30T00:00:00 None -2021-08-31T00:00:00 None -2021-09-01T00:00:00 None -2021-09-02T00:00:00 None -2021-09-03T00:00:00 None -2021-09-04T00:00:00 None -2021-09-05T00:00:00 None -2021-09-06T00:00:00 None -2021-09-07T00:00:00 None -2021-09-08T00:00:00 None -2021-09-09T00:00:00 None -2021-09-10T00:00:00 None -2021-09-11T00:00:00 None -2021-09-12T00:00:00 None -2021-09-13T00:00:00 None -2021-09-14T00:00:00 None -2021-09-15T00:00:00 None -2021-09-16T00:00:00 None -2021-09-17T00:00:00 None -2021-09-18T00:00:00 None -2021-09-19T00:00:00 None -2021-09-20T00:00:00 None -2021-09-21T00:00:00 None -2021-09-22T00:00:00 None -2021-09-23T00:00:00 None -2021-09-24T00:00:00 None -2021-09-25T00:00:00 None -2021-09-26T00:00:00 None -2021-09-27T00:00:00 None -2021-09-28T00:00:00 None -2021-09-29T00:00:00 None -2021-09-30T00:00:00 None -2021-10-01T00:00:00 None -2021-10-02T00:00:00 None -2021-10-03T00:00:00 None -2021-10-04T00:00:00 None -2021-10-05T00:00:00 None -2021-10-06T00:00:00 None -2021-10-07T00:00:00 None -2021-10-08T00:00:00 None -2021-10-09T00:00:00 None -2021-10-10T00:00:00 None -2021-10-11T00:00:00 None -2021-10-12T00:00:00 None -2021-10-13T00:00:00 None -2021-10-14T00:00:00 None -2021-10-15T00:00:00 None -2021-10-16T00:00:00 None -2021-10-17T00:00:00 None -2021-10-18T00:00:00 None -2021-10-19T00:00:00 None -2021-10-20T00:00:00 None -2021-10-21T00:00:00 None -2021-10-22T00:00:00 None -2021-10-23T00:00:00 None -2021-10-24T00:00:00 None -2021-10-25T00:00:00 None -2021-10-26T00:00:00 None -2021-10-27T00:00:00 None -2021-10-28T00:00:00 None -2021-10-29T00:00:00 None -2021-10-30T00:00:00 None -2021-10-31T00:00:00 None -2021-11-01T00:00:00 None -2021-11-02T00:00:00 None -2021-11-03T00:00:00 None -2021-11-04T00:00:00 None -2021-11-05T00:00:00 None -2021-11-06T00:00:00 None -2021-11-07T00:00:00 None -2021-11-08T00:00:00 None -2021-11-09T00:00:00 None -2021-11-10T00:00:00 None -2021-11-11T00:00:00 None -2021-11-12T00:00:00 None -2021-11-13T00:00:00 None -2021-11-14T00:00:00 None -2021-11-15T00:00:00 None -2021-11-16T00:00:00 None -2021-11-17T00:00:00 None -2021-11-18T00:00:00 None -2021-11-19T00:00:00 None -2021-11-20T00:00:00 None -2021-11-21T00:00:00 None -2021-11-22T00:00:00 None -2021-11-23T00:00:00 None -2021-11-24T00:00:00 None -2021-11-25T00:00:00 None +METRIC_TIME__DAY BOOKINGS_JOIN_TO_TIME_SPINE +------------------ ----------------------------- diff --git a/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Trino/test_join_to_time_spine_with_custom_grain_in_group_by__query_output.txt b/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Trino/test_join_to_time_spine_with_custom_grain_in_group_by__query_output.txt index 6f1e747281..6906a594ac 100644 --- a/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Trino/test_join_to_time_spine_with_custom_grain_in_group_by__query_output.txt +++ b/tests_metricflow/snapshots/test_fill_nulls_with_0.py/str/Trino/test_join_to_time_spine_with_custom_grain_in_group_by__query_output.txt @@ -1,20 +1,10 @@ test_name: test_join_to_time_spine_with_custom_grain_in_group_by test_filename: test_fill_nulls_with_0.py --- -booking__ds__martian_day bookings_join_to_time_spine --------------------------- ----------------------------- -2020-01-01T00:00:00 None -2020-01-02T00:00:00 None -2020-01-03T00:00:00 None -2020-01-04T00:00:00 None -2020-01-05T00:00:00 None -2020-01-06T00:00:00 None -2020-01-07T00:00:00 None -2020-01-08T00:00:00 46 -2020-01-09T00:00:00 None -2020-01-10T00:00:00 None -2020-01-11T00:00:00 None -2020-01-12T00:00:00 None -2020-01-13T00:00:00 None -2020-01-14T00:00:00 None -2020-01-15T00:00:00 None +booking__ds__alien_day bookings_join_to_time_spine +------------------------ ----------------------------- +2020-01-01T00:00:00 None +2020-01-02T00:00:00 31 +2020-01-03T00:00:00 15 +2020-01-04T00:00:00 None +2020-01-05T00:00:00 None diff --git a/tests_metricflow/snapshots/test_offset_metrics.py/str/BigQuery/test_custom_offset_window_with_base_grain__query_output.txt b/tests_metricflow/snapshots/test_offset_metrics.py/str/BigQuery/test_custom_offset_window_with_base_grain__query_output.txt index f5cfd0c52d..7b81799b71 100644 --- a/tests_metricflow/snapshots/test_offset_metrics.py/str/BigQuery/test_custom_offset_window_with_base_grain__query_output.txt +++ b/tests_metricflow/snapshots/test_offset_metrics.py/str/BigQuery/test_custom_offset_window_with_base_grain__query_output.txt @@ -3,19 +3,19 @@ test_filename: test_offset_metrics.py docstring: Gives a side by side comparison of bookings and bookings_offset_one_martian_day. --- -metric_time__martian_day metric_time__day bookings bookings_offset_one_martian_day --------------------------- ------------------- ---------- --------------------------------- -2020-01-08T00:00:00 2019-12-01T00:00:00 1 None -2020-01-08T00:00:00 2019-12-18T00:00:00 10 None -2020-01-08T00:00:00 2019-12-19T00:00:00 18 None -2020-01-08T00:00:00 2019-12-20T00:00:00 2 None -2020-01-08T00:00:00 2020-01-01T00:00:00 5 None -2020-01-08T00:00:00 2020-01-02T00:00:00 9 None -2020-01-08T00:00:00 2020-01-03T00:00:00 1 None -2020-01-09T00:00:00 2022-08-27T00:00:00 None 1 -2020-01-09T00:00:00 2022-09-13T00:00:00 None 10 -2020-01-09T00:00:00 2022-09-14T00:00:00 None 18 -2020-01-09T00:00:00 2022-09-15T00:00:00 None 2 -2020-01-09T00:00:00 2022-09-27T00:00:00 None 5 -2020-01-09T00:00:00 2022-09-28T00:00:00 None 9 -2020-01-09T00:00:00 2022-09-29T00:00:00 None 1 +metric_time__alien_day metric_time__day bookings bookings_offset_one_alien_day +------------------------ ------------------- ---------- ------------------------------- +2020-01-02T00:00:00 2019-12-01T00:00:00 1 None +2020-01-02T00:00:00 2019-12-18T00:00:00 10 None +2020-01-02T00:00:00 2019-12-19T00:00:00 18 None +2020-01-02T00:00:00 2019-12-20T00:00:00 2 None +2020-01-03T00:00:00 2020-01-01T00:00:00 5 None +2020-01-03T00:00:00 2020-01-02T00:00:00 9 None +2020-01-03T00:00:00 2020-01-03T00:00:00 1 None +2020-01-03T00:00:00 2029-11-30T00:00:00 None 1 +2020-01-03T00:00:00 2029-12-17T00:00:00 None 10 +2020-01-03T00:00:00 2029-12-18T00:00:00 None 18 +2020-01-03T00:00:00 2029-12-19T00:00:00 None 2 +2020-01-04T00:00:00 2030-01-01T00:00:00 None 5 +2020-01-04T00:00:00 2030-01-02T00:00:00 None 9 +2020-01-04T00:00:00 2030-01-03T00:00:00 None 1 diff --git a/tests_metricflow/snapshots/test_offset_metrics.py/str/BigQuery/test_custom_offset_window_with_grains_and_date_part__query_output.txt b/tests_metricflow/snapshots/test_offset_metrics.py/str/BigQuery/test_custom_offset_window_with_grains_and_date_part__query_output.txt index 07d2d112cd..b94d245560 100644 --- a/tests_metricflow/snapshots/test_offset_metrics.py/str/BigQuery/test_custom_offset_window_with_grains_and_date_part__query_output.txt +++ b/tests_metricflow/snapshots/test_offset_metrics.py/str/BigQuery/test_custom_offset_window_with_grains_and_date_part__query_output.txt @@ -1,7 +1,8 @@ test_name: test_custom_offset_window_with_grains_and_date_part test_filename: test_offset_metrics.py --- -metric_time__martian_day booking__ds__month metric_time__extract_year bookings_offset_one_martian_day --------------------------- -------------------- --------------------------- --------------------------------- -2020-01-09T00:00:00 2022-08-01T00:00:00 2022 1 -2020-01-09T00:00:00 2022-09-01T00:00:00 2022 45 +metric_time__alien_day booking__ds__month metric_time__extract_year bookings_offset_one_alien_day +------------------------ -------------------- --------------------------- ------------------------------- +2020-01-03T00:00:00 2029-11-01T00:00:00 2029 1 +2020-01-03T00:00:00 2029-12-01T00:00:00 2029 30 +2020-01-04T00:00:00 2030-01-01T00:00:00 2030 15 diff --git a/tests_metricflow/snapshots/test_offset_metrics.py/str/BigQuery/test_custom_offset_window_with_matching_custom_grain__query_output.txt b/tests_metricflow/snapshots/test_offset_metrics.py/str/BigQuery/test_custom_offset_window_with_matching_custom_grain__query_output.txt index c1af7abb87..ad70382cc0 100644 --- a/tests_metricflow/snapshots/test_offset_metrics.py/str/BigQuery/test_custom_offset_window_with_matching_custom_grain__query_output.txt +++ b/tests_metricflow/snapshots/test_offset_metrics.py/str/BigQuery/test_custom_offset_window_with_matching_custom_grain__query_output.txt @@ -3,7 +3,8 @@ test_filename: test_offset_metrics.py docstring: Gives a side by side comparison of bookings and bookings_offset_one_martian_day. --- -metric_time__martian_day booking__ds__martian_day bookings bookings_offset_one_martian_day --------------------------- -------------------------- ---------- --------------------------------- -2020-01-08T00:00:00 2020-01-08T00:00:00 46 None -2020-01-09T00:00:00 2020-01-09T00:00:00 None 46 +metric_time__alien_day booking__ds__alien_day bookings bookings_offset_one_alien_day +------------------------ ------------------------ ---------- ------------------------------- +2020-01-02T00:00:00 2020-01-02T00:00:00 31 None +2020-01-03T00:00:00 2020-01-03T00:00:00 15 31 +2020-01-04T00:00:00 2020-01-04T00:00:00 None 15 diff --git a/tests_metricflow/snapshots/test_offset_metrics.py/str/Databricks/test_custom_offset_window_with_base_grain__query_output.txt b/tests_metricflow/snapshots/test_offset_metrics.py/str/Databricks/test_custom_offset_window_with_base_grain__query_output.txt index f5cfd0c52d..7b81799b71 100644 --- a/tests_metricflow/snapshots/test_offset_metrics.py/str/Databricks/test_custom_offset_window_with_base_grain__query_output.txt +++ b/tests_metricflow/snapshots/test_offset_metrics.py/str/Databricks/test_custom_offset_window_with_base_grain__query_output.txt @@ -3,19 +3,19 @@ test_filename: test_offset_metrics.py docstring: Gives a side by side comparison of bookings and bookings_offset_one_martian_day. --- -metric_time__martian_day metric_time__day bookings bookings_offset_one_martian_day --------------------------- ------------------- ---------- --------------------------------- -2020-01-08T00:00:00 2019-12-01T00:00:00 1 None -2020-01-08T00:00:00 2019-12-18T00:00:00 10 None -2020-01-08T00:00:00 2019-12-19T00:00:00 18 None -2020-01-08T00:00:00 2019-12-20T00:00:00 2 None -2020-01-08T00:00:00 2020-01-01T00:00:00 5 None -2020-01-08T00:00:00 2020-01-02T00:00:00 9 None -2020-01-08T00:00:00 2020-01-03T00:00:00 1 None -2020-01-09T00:00:00 2022-08-27T00:00:00 None 1 -2020-01-09T00:00:00 2022-09-13T00:00:00 None 10 -2020-01-09T00:00:00 2022-09-14T00:00:00 None 18 -2020-01-09T00:00:00 2022-09-15T00:00:00 None 2 -2020-01-09T00:00:00 2022-09-27T00:00:00 None 5 -2020-01-09T00:00:00 2022-09-28T00:00:00 None 9 -2020-01-09T00:00:00 2022-09-29T00:00:00 None 1 +metric_time__alien_day metric_time__day bookings bookings_offset_one_alien_day +------------------------ ------------------- ---------- ------------------------------- +2020-01-02T00:00:00 2019-12-01T00:00:00 1 None +2020-01-02T00:00:00 2019-12-18T00:00:00 10 None +2020-01-02T00:00:00 2019-12-19T00:00:00 18 None +2020-01-02T00:00:00 2019-12-20T00:00:00 2 None +2020-01-03T00:00:00 2020-01-01T00:00:00 5 None +2020-01-03T00:00:00 2020-01-02T00:00:00 9 None +2020-01-03T00:00:00 2020-01-03T00:00:00 1 None +2020-01-03T00:00:00 2029-11-30T00:00:00 None 1 +2020-01-03T00:00:00 2029-12-17T00:00:00 None 10 +2020-01-03T00:00:00 2029-12-18T00:00:00 None 18 +2020-01-03T00:00:00 2029-12-19T00:00:00 None 2 +2020-01-04T00:00:00 2030-01-01T00:00:00 None 5 +2020-01-04T00:00:00 2030-01-02T00:00:00 None 9 +2020-01-04T00:00:00 2030-01-03T00:00:00 None 1 diff --git a/tests_metricflow/snapshots/test_offset_metrics.py/str/Databricks/test_custom_offset_window_with_grains_and_date_part__query_output.txt b/tests_metricflow/snapshots/test_offset_metrics.py/str/Databricks/test_custom_offset_window_with_grains_and_date_part__query_output.txt index 07d2d112cd..b94d245560 100644 --- a/tests_metricflow/snapshots/test_offset_metrics.py/str/Databricks/test_custom_offset_window_with_grains_and_date_part__query_output.txt +++ b/tests_metricflow/snapshots/test_offset_metrics.py/str/Databricks/test_custom_offset_window_with_grains_and_date_part__query_output.txt @@ -1,7 +1,8 @@ test_name: test_custom_offset_window_with_grains_and_date_part test_filename: test_offset_metrics.py --- -metric_time__martian_day booking__ds__month metric_time__extract_year bookings_offset_one_martian_day --------------------------- -------------------- --------------------------- --------------------------------- -2020-01-09T00:00:00 2022-08-01T00:00:00 2022 1 -2020-01-09T00:00:00 2022-09-01T00:00:00 2022 45 +metric_time__alien_day booking__ds__month metric_time__extract_year bookings_offset_one_alien_day +------------------------ -------------------- --------------------------- ------------------------------- +2020-01-03T00:00:00 2029-11-01T00:00:00 2029 1 +2020-01-03T00:00:00 2029-12-01T00:00:00 2029 30 +2020-01-04T00:00:00 2030-01-01T00:00:00 2030 15 diff --git a/tests_metricflow/snapshots/test_offset_metrics.py/str/Databricks/test_custom_offset_window_with_matching_custom_grain__query_output.txt b/tests_metricflow/snapshots/test_offset_metrics.py/str/Databricks/test_custom_offset_window_with_matching_custom_grain__query_output.txt index c1af7abb87..ad70382cc0 100644 --- a/tests_metricflow/snapshots/test_offset_metrics.py/str/Databricks/test_custom_offset_window_with_matching_custom_grain__query_output.txt +++ b/tests_metricflow/snapshots/test_offset_metrics.py/str/Databricks/test_custom_offset_window_with_matching_custom_grain__query_output.txt @@ -3,7 +3,8 @@ test_filename: test_offset_metrics.py docstring: Gives a side by side comparison of bookings and bookings_offset_one_martian_day. --- -metric_time__martian_day booking__ds__martian_day bookings bookings_offset_one_martian_day --------------------------- -------------------------- ---------- --------------------------------- -2020-01-08T00:00:00 2020-01-08T00:00:00 46 None -2020-01-09T00:00:00 2020-01-09T00:00:00 None 46 +metric_time__alien_day booking__ds__alien_day bookings bookings_offset_one_alien_day +------------------------ ------------------------ ---------- ------------------------------- +2020-01-02T00:00:00 2020-01-02T00:00:00 31 None +2020-01-03T00:00:00 2020-01-03T00:00:00 15 31 +2020-01-04T00:00:00 2020-01-04T00:00:00 None 15 diff --git a/tests_metricflow/snapshots/test_offset_metrics.py/str/Postgres/test_custom_offset_window_with_base_grain__query_output.txt b/tests_metricflow/snapshots/test_offset_metrics.py/str/Postgres/test_custom_offset_window_with_base_grain__query_output.txt index f5cfd0c52d..7b81799b71 100644 --- a/tests_metricflow/snapshots/test_offset_metrics.py/str/Postgres/test_custom_offset_window_with_base_grain__query_output.txt +++ b/tests_metricflow/snapshots/test_offset_metrics.py/str/Postgres/test_custom_offset_window_with_base_grain__query_output.txt @@ -3,19 +3,19 @@ test_filename: test_offset_metrics.py docstring: Gives a side by side comparison of bookings and bookings_offset_one_martian_day. --- -metric_time__martian_day metric_time__day bookings bookings_offset_one_martian_day --------------------------- ------------------- ---------- --------------------------------- -2020-01-08T00:00:00 2019-12-01T00:00:00 1 None -2020-01-08T00:00:00 2019-12-18T00:00:00 10 None -2020-01-08T00:00:00 2019-12-19T00:00:00 18 None -2020-01-08T00:00:00 2019-12-20T00:00:00 2 None -2020-01-08T00:00:00 2020-01-01T00:00:00 5 None -2020-01-08T00:00:00 2020-01-02T00:00:00 9 None -2020-01-08T00:00:00 2020-01-03T00:00:00 1 None -2020-01-09T00:00:00 2022-08-27T00:00:00 None 1 -2020-01-09T00:00:00 2022-09-13T00:00:00 None 10 -2020-01-09T00:00:00 2022-09-14T00:00:00 None 18 -2020-01-09T00:00:00 2022-09-15T00:00:00 None 2 -2020-01-09T00:00:00 2022-09-27T00:00:00 None 5 -2020-01-09T00:00:00 2022-09-28T00:00:00 None 9 -2020-01-09T00:00:00 2022-09-29T00:00:00 None 1 +metric_time__alien_day metric_time__day bookings bookings_offset_one_alien_day +------------------------ ------------------- ---------- ------------------------------- +2020-01-02T00:00:00 2019-12-01T00:00:00 1 None +2020-01-02T00:00:00 2019-12-18T00:00:00 10 None +2020-01-02T00:00:00 2019-12-19T00:00:00 18 None +2020-01-02T00:00:00 2019-12-20T00:00:00 2 None +2020-01-03T00:00:00 2020-01-01T00:00:00 5 None +2020-01-03T00:00:00 2020-01-02T00:00:00 9 None +2020-01-03T00:00:00 2020-01-03T00:00:00 1 None +2020-01-03T00:00:00 2029-11-30T00:00:00 None 1 +2020-01-03T00:00:00 2029-12-17T00:00:00 None 10 +2020-01-03T00:00:00 2029-12-18T00:00:00 None 18 +2020-01-03T00:00:00 2029-12-19T00:00:00 None 2 +2020-01-04T00:00:00 2030-01-01T00:00:00 None 5 +2020-01-04T00:00:00 2030-01-02T00:00:00 None 9 +2020-01-04T00:00:00 2030-01-03T00:00:00 None 1 diff --git a/tests_metricflow/snapshots/test_offset_metrics.py/str/Postgres/test_custom_offset_window_with_grains_and_date_part__query_output.txt b/tests_metricflow/snapshots/test_offset_metrics.py/str/Postgres/test_custom_offset_window_with_grains_and_date_part__query_output.txt index 07d2d112cd..b94d245560 100644 --- a/tests_metricflow/snapshots/test_offset_metrics.py/str/Postgres/test_custom_offset_window_with_grains_and_date_part__query_output.txt +++ b/tests_metricflow/snapshots/test_offset_metrics.py/str/Postgres/test_custom_offset_window_with_grains_and_date_part__query_output.txt @@ -1,7 +1,8 @@ test_name: test_custom_offset_window_with_grains_and_date_part test_filename: test_offset_metrics.py --- -metric_time__martian_day booking__ds__month metric_time__extract_year bookings_offset_one_martian_day --------------------------- -------------------- --------------------------- --------------------------------- -2020-01-09T00:00:00 2022-08-01T00:00:00 2022 1 -2020-01-09T00:00:00 2022-09-01T00:00:00 2022 45 +metric_time__alien_day booking__ds__month metric_time__extract_year bookings_offset_one_alien_day +------------------------ -------------------- --------------------------- ------------------------------- +2020-01-03T00:00:00 2029-11-01T00:00:00 2029 1 +2020-01-03T00:00:00 2029-12-01T00:00:00 2029 30 +2020-01-04T00:00:00 2030-01-01T00:00:00 2030 15 diff --git a/tests_metricflow/snapshots/test_offset_metrics.py/str/Postgres/test_custom_offset_window_with_matching_custom_grain__query_output.txt b/tests_metricflow/snapshots/test_offset_metrics.py/str/Postgres/test_custom_offset_window_with_matching_custom_grain__query_output.txt index c1af7abb87..ad70382cc0 100644 --- a/tests_metricflow/snapshots/test_offset_metrics.py/str/Postgres/test_custom_offset_window_with_matching_custom_grain__query_output.txt +++ b/tests_metricflow/snapshots/test_offset_metrics.py/str/Postgres/test_custom_offset_window_with_matching_custom_grain__query_output.txt @@ -3,7 +3,8 @@ test_filename: test_offset_metrics.py docstring: Gives a side by side comparison of bookings and bookings_offset_one_martian_day. --- -metric_time__martian_day booking__ds__martian_day bookings bookings_offset_one_martian_day --------------------------- -------------------------- ---------- --------------------------------- -2020-01-08T00:00:00 2020-01-08T00:00:00 46 None -2020-01-09T00:00:00 2020-01-09T00:00:00 None 46 +metric_time__alien_day booking__ds__alien_day bookings bookings_offset_one_alien_day +------------------------ ------------------------ ---------- ------------------------------- +2020-01-02T00:00:00 2020-01-02T00:00:00 31 None +2020-01-03T00:00:00 2020-01-03T00:00:00 15 31 +2020-01-04T00:00:00 2020-01-04T00:00:00 None 15 diff --git a/tests_metricflow/snapshots/test_offset_metrics.py/str/Redshift/test_custom_offset_window_with_base_grain__query_output.txt b/tests_metricflow/snapshots/test_offset_metrics.py/str/Redshift/test_custom_offset_window_with_base_grain__query_output.txt index f5cfd0c52d..7b81799b71 100644 --- a/tests_metricflow/snapshots/test_offset_metrics.py/str/Redshift/test_custom_offset_window_with_base_grain__query_output.txt +++ b/tests_metricflow/snapshots/test_offset_metrics.py/str/Redshift/test_custom_offset_window_with_base_grain__query_output.txt @@ -3,19 +3,19 @@ test_filename: test_offset_metrics.py docstring: Gives a side by side comparison of bookings and bookings_offset_one_martian_day. --- -metric_time__martian_day metric_time__day bookings bookings_offset_one_martian_day --------------------------- ------------------- ---------- --------------------------------- -2020-01-08T00:00:00 2019-12-01T00:00:00 1 None -2020-01-08T00:00:00 2019-12-18T00:00:00 10 None -2020-01-08T00:00:00 2019-12-19T00:00:00 18 None -2020-01-08T00:00:00 2019-12-20T00:00:00 2 None -2020-01-08T00:00:00 2020-01-01T00:00:00 5 None -2020-01-08T00:00:00 2020-01-02T00:00:00 9 None -2020-01-08T00:00:00 2020-01-03T00:00:00 1 None -2020-01-09T00:00:00 2022-08-27T00:00:00 None 1 -2020-01-09T00:00:00 2022-09-13T00:00:00 None 10 -2020-01-09T00:00:00 2022-09-14T00:00:00 None 18 -2020-01-09T00:00:00 2022-09-15T00:00:00 None 2 -2020-01-09T00:00:00 2022-09-27T00:00:00 None 5 -2020-01-09T00:00:00 2022-09-28T00:00:00 None 9 -2020-01-09T00:00:00 2022-09-29T00:00:00 None 1 +metric_time__alien_day metric_time__day bookings bookings_offset_one_alien_day +------------------------ ------------------- ---------- ------------------------------- +2020-01-02T00:00:00 2019-12-01T00:00:00 1 None +2020-01-02T00:00:00 2019-12-18T00:00:00 10 None +2020-01-02T00:00:00 2019-12-19T00:00:00 18 None +2020-01-02T00:00:00 2019-12-20T00:00:00 2 None +2020-01-03T00:00:00 2020-01-01T00:00:00 5 None +2020-01-03T00:00:00 2020-01-02T00:00:00 9 None +2020-01-03T00:00:00 2020-01-03T00:00:00 1 None +2020-01-03T00:00:00 2029-11-30T00:00:00 None 1 +2020-01-03T00:00:00 2029-12-17T00:00:00 None 10 +2020-01-03T00:00:00 2029-12-18T00:00:00 None 18 +2020-01-03T00:00:00 2029-12-19T00:00:00 None 2 +2020-01-04T00:00:00 2030-01-01T00:00:00 None 5 +2020-01-04T00:00:00 2030-01-02T00:00:00 None 9 +2020-01-04T00:00:00 2030-01-03T00:00:00 None 1 diff --git a/tests_metricflow/snapshots/test_offset_metrics.py/str/Redshift/test_custom_offset_window_with_grains_and_date_part__query_output.txt b/tests_metricflow/snapshots/test_offset_metrics.py/str/Redshift/test_custom_offset_window_with_grains_and_date_part__query_output.txt index 07d2d112cd..b94d245560 100644 --- a/tests_metricflow/snapshots/test_offset_metrics.py/str/Redshift/test_custom_offset_window_with_grains_and_date_part__query_output.txt +++ b/tests_metricflow/snapshots/test_offset_metrics.py/str/Redshift/test_custom_offset_window_with_grains_and_date_part__query_output.txt @@ -1,7 +1,8 @@ test_name: test_custom_offset_window_with_grains_and_date_part test_filename: test_offset_metrics.py --- -metric_time__martian_day booking__ds__month metric_time__extract_year bookings_offset_one_martian_day --------------------------- -------------------- --------------------------- --------------------------------- -2020-01-09T00:00:00 2022-08-01T00:00:00 2022 1 -2020-01-09T00:00:00 2022-09-01T00:00:00 2022 45 +metric_time__alien_day booking__ds__month metric_time__extract_year bookings_offset_one_alien_day +------------------------ -------------------- --------------------------- ------------------------------- +2020-01-03T00:00:00 2029-11-01T00:00:00 2029 1 +2020-01-03T00:00:00 2029-12-01T00:00:00 2029 30 +2020-01-04T00:00:00 2030-01-01T00:00:00 2030 15 diff --git a/tests_metricflow/snapshots/test_offset_metrics.py/str/Redshift/test_custom_offset_window_with_matching_custom_grain__query_output.txt b/tests_metricflow/snapshots/test_offset_metrics.py/str/Redshift/test_custom_offset_window_with_matching_custom_grain__query_output.txt index c1af7abb87..ad70382cc0 100644 --- a/tests_metricflow/snapshots/test_offset_metrics.py/str/Redshift/test_custom_offset_window_with_matching_custom_grain__query_output.txt +++ b/tests_metricflow/snapshots/test_offset_metrics.py/str/Redshift/test_custom_offset_window_with_matching_custom_grain__query_output.txt @@ -3,7 +3,8 @@ test_filename: test_offset_metrics.py docstring: Gives a side by side comparison of bookings and bookings_offset_one_martian_day. --- -metric_time__martian_day booking__ds__martian_day bookings bookings_offset_one_martian_day --------------------------- -------------------------- ---------- --------------------------------- -2020-01-08T00:00:00 2020-01-08T00:00:00 46 None -2020-01-09T00:00:00 2020-01-09T00:00:00 None 46 +metric_time__alien_day booking__ds__alien_day bookings bookings_offset_one_alien_day +------------------------ ------------------------ ---------- ------------------------------- +2020-01-02T00:00:00 2020-01-02T00:00:00 31 None +2020-01-03T00:00:00 2020-01-03T00:00:00 15 31 +2020-01-04T00:00:00 2020-01-04T00:00:00 None 15 diff --git a/tests_metricflow/snapshots/test_offset_metrics.py/str/Snowflake/test_custom_offset_window_with_base_grain__query_output.txt b/tests_metricflow/snapshots/test_offset_metrics.py/str/Snowflake/test_custom_offset_window_with_base_grain__query_output.txt index 6d42a0527d..a8d0821da4 100644 --- a/tests_metricflow/snapshots/test_offset_metrics.py/str/Snowflake/test_custom_offset_window_with_base_grain__query_output.txt +++ b/tests_metricflow/snapshots/test_offset_metrics.py/str/Snowflake/test_custom_offset_window_with_base_grain__query_output.txt @@ -3,19 +3,19 @@ test_filename: test_offset_metrics.py docstring: Gives a side by side comparison of bookings and bookings_offset_one_martian_day. --- -METRIC_TIME__MARTIAN_DAY METRIC_TIME__DAY BOOKINGS BOOKINGS_OFFSET_ONE_MARTIAN_DAY --------------------------- ------------------- ---------- --------------------------------- -2020-01-08T00:00:00 2019-12-01T00:00:00 1 None -2020-01-08T00:00:00 2019-12-18T00:00:00 10 None -2020-01-08T00:00:00 2019-12-19T00:00:00 18 None -2020-01-08T00:00:00 2019-12-20T00:00:00 2 None -2020-01-08T00:00:00 2020-01-01T00:00:00 5 None -2020-01-08T00:00:00 2020-01-02T00:00:00 9 None -2020-01-08T00:00:00 2020-01-03T00:00:00 1 None -2020-01-09T00:00:00 2022-08-27T00:00:00 None 1 -2020-01-09T00:00:00 2022-09-13T00:00:00 None 10 -2020-01-09T00:00:00 2022-09-14T00:00:00 None 18 -2020-01-09T00:00:00 2022-09-15T00:00:00 None 2 -2020-01-09T00:00:00 2022-09-27T00:00:00 None 5 -2020-01-09T00:00:00 2022-09-28T00:00:00 None 9 -2020-01-09T00:00:00 2022-09-29T00:00:00 None 1 +METRIC_TIME__ALIEN_DAY METRIC_TIME__DAY BOOKINGS BOOKINGS_OFFSET_ONE_ALIEN_DAY +------------------------ ------------------- ---------- ------------------------------- +2020-01-02T00:00:00 2019-12-01T00:00:00 1 None +2020-01-02T00:00:00 2019-12-18T00:00:00 10 None +2020-01-02T00:00:00 2019-12-19T00:00:00 18 None +2020-01-02T00:00:00 2019-12-20T00:00:00 2 None +2020-01-03T00:00:00 2020-01-01T00:00:00 5 None +2020-01-03T00:00:00 2020-01-02T00:00:00 9 None +2020-01-03T00:00:00 2020-01-03T00:00:00 1 None +2020-01-03T00:00:00 2029-11-30T00:00:00 None 1 +2020-01-03T00:00:00 2029-12-17T00:00:00 None 10 +2020-01-03T00:00:00 2029-12-18T00:00:00 None 18 +2020-01-03T00:00:00 2029-12-19T00:00:00 None 2 +2020-01-04T00:00:00 2030-01-01T00:00:00 None 5 +2020-01-04T00:00:00 2030-01-02T00:00:00 None 9 +2020-01-04T00:00:00 2030-01-03T00:00:00 None 1 diff --git a/tests_metricflow/snapshots/test_offset_metrics.py/str/Snowflake/test_custom_offset_window_with_grains_and_date_part__query_output.txt b/tests_metricflow/snapshots/test_offset_metrics.py/str/Snowflake/test_custom_offset_window_with_grains_and_date_part__query_output.txt index cf609f730f..5ef0da7a5a 100644 --- a/tests_metricflow/snapshots/test_offset_metrics.py/str/Snowflake/test_custom_offset_window_with_grains_and_date_part__query_output.txt +++ b/tests_metricflow/snapshots/test_offset_metrics.py/str/Snowflake/test_custom_offset_window_with_grains_and_date_part__query_output.txt @@ -1,7 +1,8 @@ test_name: test_custom_offset_window_with_grains_and_date_part test_filename: test_offset_metrics.py --- -METRIC_TIME__MARTIAN_DAY BOOKING__DS__MONTH METRIC_TIME__EXTRACT_YEAR BOOKINGS_OFFSET_ONE_MARTIAN_DAY --------------------------- -------------------- --------------------------- --------------------------------- -2020-01-09T00:00:00 2022-08-01T00:00:00 2022 1 -2020-01-09T00:00:00 2022-09-01T00:00:00 2022 45 +METRIC_TIME__ALIEN_DAY BOOKING__DS__MONTH METRIC_TIME__EXTRACT_YEAR BOOKINGS_OFFSET_ONE_ALIEN_DAY +------------------------ -------------------- --------------------------- ------------------------------- +2020-01-03T00:00:00 2029-11-01T00:00:00 2029 1 +2020-01-03T00:00:00 2029-12-01T00:00:00 2029 30 +2020-01-04T00:00:00 2030-01-01T00:00:00 2030 15 diff --git a/tests_metricflow/snapshots/test_offset_metrics.py/str/Snowflake/test_custom_offset_window_with_matching_custom_grain__query_output.txt b/tests_metricflow/snapshots/test_offset_metrics.py/str/Snowflake/test_custom_offset_window_with_matching_custom_grain__query_output.txt index 7ae4121d0b..f2102a51cc 100644 --- a/tests_metricflow/snapshots/test_offset_metrics.py/str/Snowflake/test_custom_offset_window_with_matching_custom_grain__query_output.txt +++ b/tests_metricflow/snapshots/test_offset_metrics.py/str/Snowflake/test_custom_offset_window_with_matching_custom_grain__query_output.txt @@ -3,7 +3,8 @@ test_filename: test_offset_metrics.py docstring: Gives a side by side comparison of bookings and bookings_offset_one_martian_day. --- -METRIC_TIME__MARTIAN_DAY BOOKING__DS__MARTIAN_DAY BOOKINGS BOOKINGS_OFFSET_ONE_MARTIAN_DAY --------------------------- -------------------------- ---------- --------------------------------- -2020-01-08T00:00:00 2020-01-08T00:00:00 46 None -2020-01-09T00:00:00 2020-01-09T00:00:00 None 46 +METRIC_TIME__ALIEN_DAY BOOKING__DS__ALIEN_DAY BOOKINGS BOOKINGS_OFFSET_ONE_ALIEN_DAY +------------------------ ------------------------ ---------- ------------------------------- +2020-01-02T00:00:00 2020-01-02T00:00:00 31 None +2020-01-03T00:00:00 2020-01-03T00:00:00 15 31 +2020-01-04T00:00:00 2020-01-04T00:00:00 None 15 diff --git a/tests_metricflow/snapshots/test_offset_metrics.py/str/Trino/test_custom_offset_window_with_base_grain__query_output.txt b/tests_metricflow/snapshots/test_offset_metrics.py/str/Trino/test_custom_offset_window_with_base_grain__query_output.txt index f5cfd0c52d..7b81799b71 100644 --- a/tests_metricflow/snapshots/test_offset_metrics.py/str/Trino/test_custom_offset_window_with_base_grain__query_output.txt +++ b/tests_metricflow/snapshots/test_offset_metrics.py/str/Trino/test_custom_offset_window_with_base_grain__query_output.txt @@ -3,19 +3,19 @@ test_filename: test_offset_metrics.py docstring: Gives a side by side comparison of bookings and bookings_offset_one_martian_day. --- -metric_time__martian_day metric_time__day bookings bookings_offset_one_martian_day --------------------------- ------------------- ---------- --------------------------------- -2020-01-08T00:00:00 2019-12-01T00:00:00 1 None -2020-01-08T00:00:00 2019-12-18T00:00:00 10 None -2020-01-08T00:00:00 2019-12-19T00:00:00 18 None -2020-01-08T00:00:00 2019-12-20T00:00:00 2 None -2020-01-08T00:00:00 2020-01-01T00:00:00 5 None -2020-01-08T00:00:00 2020-01-02T00:00:00 9 None -2020-01-08T00:00:00 2020-01-03T00:00:00 1 None -2020-01-09T00:00:00 2022-08-27T00:00:00 None 1 -2020-01-09T00:00:00 2022-09-13T00:00:00 None 10 -2020-01-09T00:00:00 2022-09-14T00:00:00 None 18 -2020-01-09T00:00:00 2022-09-15T00:00:00 None 2 -2020-01-09T00:00:00 2022-09-27T00:00:00 None 5 -2020-01-09T00:00:00 2022-09-28T00:00:00 None 9 -2020-01-09T00:00:00 2022-09-29T00:00:00 None 1 +metric_time__alien_day metric_time__day bookings bookings_offset_one_alien_day +------------------------ ------------------- ---------- ------------------------------- +2020-01-02T00:00:00 2019-12-01T00:00:00 1 None +2020-01-02T00:00:00 2019-12-18T00:00:00 10 None +2020-01-02T00:00:00 2019-12-19T00:00:00 18 None +2020-01-02T00:00:00 2019-12-20T00:00:00 2 None +2020-01-03T00:00:00 2020-01-01T00:00:00 5 None +2020-01-03T00:00:00 2020-01-02T00:00:00 9 None +2020-01-03T00:00:00 2020-01-03T00:00:00 1 None +2020-01-03T00:00:00 2029-11-30T00:00:00 None 1 +2020-01-03T00:00:00 2029-12-17T00:00:00 None 10 +2020-01-03T00:00:00 2029-12-18T00:00:00 None 18 +2020-01-03T00:00:00 2029-12-19T00:00:00 None 2 +2020-01-04T00:00:00 2030-01-01T00:00:00 None 5 +2020-01-04T00:00:00 2030-01-02T00:00:00 None 9 +2020-01-04T00:00:00 2030-01-03T00:00:00 None 1 diff --git a/tests_metricflow/snapshots/test_offset_metrics.py/str/Trino/test_custom_offset_window_with_grains_and_date_part__query_output.txt b/tests_metricflow/snapshots/test_offset_metrics.py/str/Trino/test_custom_offset_window_with_grains_and_date_part__query_output.txt index 07d2d112cd..b94d245560 100644 --- a/tests_metricflow/snapshots/test_offset_metrics.py/str/Trino/test_custom_offset_window_with_grains_and_date_part__query_output.txt +++ b/tests_metricflow/snapshots/test_offset_metrics.py/str/Trino/test_custom_offset_window_with_grains_and_date_part__query_output.txt @@ -1,7 +1,8 @@ test_name: test_custom_offset_window_with_grains_and_date_part test_filename: test_offset_metrics.py --- -metric_time__martian_day booking__ds__month metric_time__extract_year bookings_offset_one_martian_day --------------------------- -------------------- --------------------------- --------------------------------- -2020-01-09T00:00:00 2022-08-01T00:00:00 2022 1 -2020-01-09T00:00:00 2022-09-01T00:00:00 2022 45 +metric_time__alien_day booking__ds__month metric_time__extract_year bookings_offset_one_alien_day +------------------------ -------------------- --------------------------- ------------------------------- +2020-01-03T00:00:00 2029-11-01T00:00:00 2029 1 +2020-01-03T00:00:00 2029-12-01T00:00:00 2029 30 +2020-01-04T00:00:00 2030-01-01T00:00:00 2030 15 diff --git a/tests_metricflow/snapshots/test_offset_metrics.py/str/Trino/test_custom_offset_window_with_matching_custom_grain__query_output.txt b/tests_metricflow/snapshots/test_offset_metrics.py/str/Trino/test_custom_offset_window_with_matching_custom_grain__query_output.txt index c1af7abb87..ad70382cc0 100644 --- a/tests_metricflow/snapshots/test_offset_metrics.py/str/Trino/test_custom_offset_window_with_matching_custom_grain__query_output.txt +++ b/tests_metricflow/snapshots/test_offset_metrics.py/str/Trino/test_custom_offset_window_with_matching_custom_grain__query_output.txt @@ -3,7 +3,8 @@ test_filename: test_offset_metrics.py docstring: Gives a side by side comparison of bookings and bookings_offset_one_martian_day. --- -metric_time__martian_day booking__ds__martian_day bookings bookings_offset_one_martian_day --------------------------- -------------------------- ---------- --------------------------------- -2020-01-08T00:00:00 2020-01-08T00:00:00 46 None -2020-01-09T00:00:00 2020-01-09T00:00:00 None 46 +metric_time__alien_day booking__ds__alien_day bookings bookings_offset_one_alien_day +------------------------ ------------------------ ---------- ------------------------------- +2020-01-02T00:00:00 2020-01-02T00:00:00 31 None +2020-01-03T00:00:00 2020-01-03T00:00:00 15 31 +2020-01-04T00:00:00 2020-01-04T00:00:00 None 15