diff --git a/.changes/unreleased/Fixes-20241030-201214.yaml b/.changes/unreleased/Fixes-20241030-201214.yaml
new file mode 100644
index 0000000000..f89f8b7f02
--- /dev/null
+++ b/.changes/unreleased/Fixes-20241030-201214.yaml
@@ -0,0 +1,6 @@
+kind: Fixes
+body: Prevent SourceScanOptimizer from combining nodes that use the same input metric alias in different derived metrics
+time: 2024-10-30T20:12:14.516814+01:00
+custom:
+ Author: serramatutu
+ Issue: "1494"
diff --git a/metricflow-semantics/metricflow_semantics/test_helpers/semantic_manifest_yamls/simple_manifest/metrics.yaml b/metricflow-semantics/metricflow_semantics/test_helpers/semantic_manifest_yamls/simple_manifest/metrics.yaml
index d544876992..fe28fb047d 100644
--- a/metricflow-semantics/metricflow_semantics/test_helpers/semantic_manifest_yamls/simple_manifest/metrics.yaml
+++ b/metricflow-semantics/metricflow_semantics/test_helpers/semantic_manifest_yamls/simple_manifest/metrics.yaml
@@ -817,3 +817,36 @@ metric:
name: listings
filter: "{{ Metric('views', ['listing']) }} > 10"
time_granularity: week
+---
+# note that in both 1a and 1b "shared_alias" refer to "bookings", whereas
+# in 2 it refers to "instant_bookings", hence the naming difference
+metric:
+ name: derived_shared_alias_1a
+ description: "Minimal repro case for derived metrics which give the same alias for different underlying metrics"
+ type: derived
+ type_params:
+ expr: shared_alias - 10
+ metrics:
+ - name: bookings
+ alias: shared_alias
+---
+metric:
+ name: derived_shared_alias_1b
+ description: "Minimal repro case for derived metrics which give the same alias for different underlying metrics"
+ type: derived
+ type_params:
+ expr: shared_alias - 100
+ metrics:
+ - name: bookings
+ alias: shared_alias
+---
+metric:
+ name: derived_shared_alias_2
+ description: "Minimal repro case for derived metrics which give the same alias for different underlying metrics"
+ type: derived
+ type_params:
+ expr: shared_alias + 10
+ metrics:
+ - name: instant_bookings
+ alias: shared_alias
+---
diff --git a/metricflow-semantics/tests_metricflow_semantics/snapshots/test_linkable_spec_resolver.py/list/test_linkable_element_set_as_spec_set__set0.txt b/metricflow-semantics/tests_metricflow_semantics/snapshots/test_linkable_spec_resolver.py/list/test_linkable_element_set_as_spec_set__set0.txt
index 7996061066..79711987c4 100644
--- a/metricflow-semantics/tests_metricflow_semantics/snapshots/test_linkable_spec_resolver.py/list/test_linkable_element_set_as_spec_set__set0.txt
+++ b/metricflow-semantics/tests_metricflow_semantics/snapshots/test_linkable_spec_resolver.py/list/test_linkable_element_set_as_spec_set__set0.txt
@@ -28,6 +28,9 @@
'listing__booking__listing__bookings_per_dollar',
'listing__booking__listing__derived_bookings_0',
'listing__booking__listing__derived_bookings_1',
+ 'listing__booking__listing__derived_shared_alias_1a',
+ 'listing__booking__listing__derived_shared_alias_1b',
+ 'listing__booking__listing__derived_shared_alias_2',
'listing__booking__listing__discrete_booking_value_p99',
'listing__booking__listing__double_counted_delayed_bookings',
'listing__booking__listing__instant_booking_fraction_of_max_value',
@@ -90,6 +93,9 @@
'listing__created_at__year',
'listing__derived_bookings_0',
'listing__derived_bookings_1',
+ 'listing__derived_shared_alias_1a',
+ 'listing__derived_shared_alias_1b',
+ 'listing__derived_shared_alias_2',
'listing__discrete_booking_value_p99',
'listing__double_counted_delayed_bookings',
'listing__ds__day',
@@ -441,6 +447,9 @@
'user__listing__user__bookings_per_view',
'user__listing__user__derived_bookings_0',
'user__listing__user__derived_bookings_1',
+ 'user__listing__user__derived_shared_alias_1a',
+ 'user__listing__user__derived_shared_alias_1b',
+ 'user__listing__user__derived_shared_alias_2',
'user__listing__user__discrete_booking_value_p99',
'user__listing__user__double_counted_delayed_bookings',
'user__listing__user__instant_booking_fraction_of_max_value',
diff --git a/metricflow-semantics/tests_metricflow_semantics/snapshots/test_semantic_model_container.py/str/test_linkable_elements_for_measure__result0.txt b/metricflow-semantics/tests_metricflow_semantics/snapshots/test_semantic_model_container.py/str/test_linkable_elements_for_measure__result0.txt
index ceb0623a1e..3a46959d6e 100644
--- a/metricflow-semantics/tests_metricflow_semantics/snapshots/test_semantic_model_container.py/str/test_linkable_elements_for_measure__result0.txt
+++ b/metricflow-semantics/tests_metricflow_semantics/snapshots/test_semantic_model_container.py/str/test_linkable_elements_for_measure__result0.txt
@@ -45,6 +45,9 @@ Model Join-Path Entity Links
('listings_latest',) ("('listing',)", "('booking', 'listing')") bookings_per_dollar ['JOINED', 'METRIC']
('listings_latest',) ("('listing',)", "('booking', 'listing')") derived_bookings_0 ['JOINED', 'METRIC']
('listings_latest',) ("('listing',)", "('booking', 'listing')") derived_bookings_1 ['JOINED', 'METRIC']
+('listings_latest',) ("('listing',)", "('booking', 'listing')") derived_shared_alias_1a ['JOINED', 'METRIC']
+('listings_latest',) ("('listing',)", "('booking', 'listing')") derived_shared_alias_1b ['JOINED', 'METRIC']
+('listings_latest',) ("('listing',)", "('booking', 'listing')") derived_shared_alias_2 ['JOINED', 'METRIC']
('listings_latest',) ("('listing',)", "('booking', 'listing')") discrete_booking_value_p99 ['JOINED', 'METRIC']
('listings_latest',) ("('listing',)", "('booking', 'listing')") double_counted_delayed_bookings ['JOINED', 'METRIC']
('listings_latest',) ("('listing',)", "('booking', 'listing')") instant_booking_fraction_of_max_value ['JOINED', 'METRIC']
@@ -94,6 +97,9 @@ Model Join-Path Entity Links
('listings_latest',) ("('listing',)", "('listing',)") bookings_per_view ['JOINED', 'METRIC']
('listings_latest',) ("('listing',)", "('listing',)") derived_bookings_0 ['JOINED', 'METRIC']
('listings_latest',) ("('listing',)", "('listing',)") derived_bookings_1 ['JOINED', 'METRIC']
+('listings_latest',) ("('listing',)", "('listing',)") derived_shared_alias_1a ['JOINED', 'METRIC']
+('listings_latest',) ("('listing',)", "('listing',)") derived_shared_alias_1b ['JOINED', 'METRIC']
+('listings_latest',) ("('listing',)", "('listing',)") derived_shared_alias_2 ['JOINED', 'METRIC']
('listings_latest',) ("('listing',)", "('listing',)") discrete_booking_value_p99 ['JOINED', 'METRIC']
('listings_latest',) ("('listing',)", "('listing',)") double_counted_delayed_bookings ['JOINED', 'METRIC']
('listings_latest',) ("('listing',)", "('listing',)") instant_booking_fraction_of_max_value ['JOINED', 'METRIC']
@@ -156,6 +162,9 @@ Model Join-Path Entity Links
('listings_latest',) ("('user',)", "('listing', 'user')") bookings_per_view ['JOINED', 'METRIC']
('listings_latest',) ("('user',)", "('listing', 'user')") derived_bookings_0 ['JOINED', 'METRIC']
('listings_latest',) ("('user',)", "('listing', 'user')") derived_bookings_1 ['JOINED', 'METRIC']
+('listings_latest',) ("('user',)", "('listing', 'user')") derived_shared_alias_1a ['JOINED', 'METRIC']
+('listings_latest',) ("('user',)", "('listing', 'user')") derived_shared_alias_1b ['JOINED', 'METRIC']
+('listings_latest',) ("('user',)", "('listing', 'user')") derived_shared_alias_2 ['JOINED', 'METRIC']
('listings_latest',) ("('user',)", "('listing', 'user')") discrete_booking_value_p99 ['JOINED', 'METRIC']
('listings_latest',) ("('user',)", "('listing', 'user')") double_counted_delayed_bookings ['JOINED', 'METRIC']
('listings_latest',) ("('user',)", "('listing', 'user')") instant_booking_fraction_of_max_value ['JOINED', 'METRIC']
diff --git a/metricflow-semantics/tests_metricflow_semantics/snapshots/test_semantic_model_container.py/tuple/test_linkable_elements_for_no_metrics_query__result0.txt b/metricflow-semantics/tests_metricflow_semantics/snapshots/test_semantic_model_container.py/tuple/test_linkable_elements_for_no_metrics_query__result0.txt
index 16e5f2e8b3..a6ef242107 100644
--- a/metricflow-semantics/tests_metricflow_semantics/snapshots/test_semantic_model_container.py/tuple/test_linkable_elements_for_no_metrics_query__result0.txt
+++ b/metricflow-semantics/tests_metricflow_semantics/snapshots/test_semantic_model_container.py/tuple/test_linkable_elements_for_no_metrics_query__result0.txt
@@ -76,6 +76,9 @@
'company__listing__user__company__bookings_per_view',
'company__listing__user__company__derived_bookings_0',
'company__listing__user__company__derived_bookings_1',
+ 'company__listing__user__company__derived_shared_alias_1a',
+ 'company__listing__user__company__derived_shared_alias_1b',
+ 'company__listing__user__company__derived_shared_alias_2',
'company__listing__user__company__discrete_booking_value_p99',
'company__listing__user__company__double_counted_delayed_bookings',
'company__listing__user__company__instant_booking_fraction_of_max_value',
@@ -151,6 +154,9 @@
'guest__booking__guest__bookings_per_dollar',
'guest__booking__guest__derived_bookings_0',
'guest__booking__guest__derived_bookings_1',
+ 'guest__booking__guest__derived_shared_alias_1a',
+ 'guest__booking__guest__derived_shared_alias_1b',
+ 'guest__booking__guest__derived_shared_alias_2',
'guest__booking__guest__discrete_booking_value_p99',
'guest__booking__guest__double_counted_delayed_bookings',
'guest__booking__guest__instant_booking_fraction_of_max_value',
@@ -186,6 +192,9 @@
'guest__bookings_per_dollar',
'guest__derived_bookings_0',
'guest__derived_bookings_1',
+ 'guest__derived_shared_alias_1a',
+ 'guest__derived_shared_alias_1b',
+ 'guest__derived_shared_alias_2',
'guest__discrete_booking_value_p99',
'guest__double_counted_delayed_bookings',
'guest__instant_booking_fraction_of_max_value',
@@ -232,6 +241,9 @@
'host__booking__host__bookings_per_dollar',
'host__booking__host__derived_bookings_0',
'host__booking__host__derived_bookings_1',
+ 'host__booking__host__derived_shared_alias_1a',
+ 'host__booking__host__derived_shared_alias_1b',
+ 'host__booking__host__derived_shared_alias_2',
'host__booking__host__discrete_booking_value_p99',
'host__booking__host__double_counted_delayed_bookings',
'host__booking__host__instant_booking_fraction_of_max_value',
@@ -267,6 +279,9 @@
'host__bookings_per_dollar',
'host__derived_bookings_0',
'host__derived_bookings_1',
+ 'host__derived_shared_alias_1a',
+ 'host__derived_shared_alias_1b',
+ 'host__derived_shared_alias_2',
'host__discrete_booking_value_p99',
'host__double_counted_delayed_bookings',
'host__instant_booking_fraction_of_max_value',
@@ -314,6 +329,9 @@
'listing__booking__listing__bookings_per_dollar',
'listing__booking__listing__derived_bookings_0',
'listing__booking__listing__derived_bookings_1',
+ 'listing__booking__listing__derived_shared_alias_1a',
+ 'listing__booking__listing__derived_shared_alias_1b',
+ 'listing__booking__listing__derived_shared_alias_2',
'listing__booking__listing__discrete_booking_value_p99',
'listing__booking__listing__double_counted_delayed_bookings',
'listing__booking__listing__instant_booking_fraction_of_max_value',
@@ -362,6 +380,9 @@
'listing__created_at__extract_year',
'listing__derived_bookings_0',
'listing__derived_bookings_1',
+ 'listing__derived_shared_alias_1a',
+ 'listing__derived_shared_alias_1b',
+ 'listing__derived_shared_alias_2',
'listing__discrete_booking_value_p99',
'listing__double_counted_delayed_bookings',
'listing__ds__day',
@@ -426,6 +447,9 @@
'lux_listing__listing__lux_listing__bookings_per_view',
'lux_listing__listing__lux_listing__derived_bookings_0',
'lux_listing__listing__lux_listing__derived_bookings_1',
+ 'lux_listing__listing__lux_listing__derived_shared_alias_1a',
+ 'lux_listing__listing__lux_listing__derived_shared_alias_1b',
+ 'lux_listing__listing__lux_listing__derived_shared_alias_2',
'lux_listing__listing__lux_listing__discrete_booking_value_p99',
'lux_listing__listing__lux_listing__double_counted_delayed_bookings',
'lux_listing__listing__lux_listing__instant_booking_fraction_of_max_value',
@@ -571,6 +595,9 @@
'user__listing__user__bookings_per_view',
'user__listing__user__derived_bookings_0',
'user__listing__user__derived_bookings_1',
+ 'user__listing__user__derived_shared_alias_1a',
+ 'user__listing__user__derived_shared_alias_1b',
+ 'user__listing__user__derived_shared_alias_2',
'user__listing__user__discrete_booking_value_p99',
'user__listing__user__double_counted_delayed_bookings',
'user__listing__user__instant_booking_fraction_of_max_value',
diff --git a/metricflow/dataflow/nodes/compute_metrics.py b/metricflow/dataflow/nodes/compute_metrics.py
index 9d4ad3dd92..5241d60453 100644
--- a/metricflow/dataflow/nodes/compute_metrics.py
+++ b/metricflow/dataflow/nodes/compute_metrics.py
@@ -31,6 +31,7 @@ class ComputeMetricsNode(DataflowPlanNode):
def __post_init__(self) -> None: # noqa: D105
super().__post_init__()
+
assert len(self.parent_nodes) == 1
@staticmethod
@@ -97,6 +98,19 @@ def can_combine(self, other_node: ComputeMetricsNode) -> Tuple[bool, str]:
if other_node.for_group_by_source_node != self.for_group_by_source_node:
return False, "one node is a group by metric source node"
+ alias_to_metric_spec = {spec.alias: spec for spec in self.metric_specs if spec.alias is not None}
+
+ for spec in other_node.metric_specs:
+ if (
+ spec.alias is not None
+ and spec.alias in alias_to_metric_spec
+ and alias_to_metric_spec[spec.alias] != spec
+ ):
+ return (
+ False,
+ f"Alias '{spec.alias}' is defined in both nodes but it refers to different things in each of them",
+ )
+
return True, ""
def with_new_parents(self, new_parent_nodes: Sequence[DataflowPlanNode]) -> ComputeMetricsNode: # noqa: D102
diff --git a/tests_metricflow/dataflow/optimizer/source_scan/test_source_scan_optimizer.py b/tests_metricflow/dataflow/optimizer/source_scan/test_source_scan_optimizer.py
index 0f45668c5f..9af0630d1f 100644
--- a/tests_metricflow/dataflow/optimizer/source_scan/test_source_scan_optimizer.py
+++ b/tests_metricflow/dataflow/optimizer/source_scan/test_source_scan_optimizer.py
@@ -333,6 +333,60 @@ def test_derived_metric_with_non_derived_metric(
)
+@pytest.mark.sql_engine_snapshot
+def test_derived_metric_same_alias_components_combined(
+ request: FixtureRequest,
+ mf_test_configuration: MetricFlowTestConfiguration,
+ dataflow_plan_builder: DataflowPlanBuilder,
+) -> None:
+ """Tests optimization of querying 2 metrics which give the same alias to the same thing in their components.
+
+ In this case we DO combine source nodes, since the components are the same exact thing so we don't need to
+ scan over it twice
+ """
+ check_optimization(
+ request=request,
+ mf_test_configuration=mf_test_configuration,
+ dataflow_plan_builder=dataflow_plan_builder,
+ query_spec=MetricFlowQuerySpec(
+ metric_specs=(
+ MetricSpec(element_name="derived_shared_alias_1a"),
+ MetricSpec(element_name="derived_shared_alias_1b"),
+ ),
+ dimension_specs=(DimensionSpec(element_name="is_instant", entity_links=(EntityReference("booking"),)),),
+ ),
+ expected_num_sources_in_unoptimized=2,
+ expected_num_sources_in_optimized=1,
+ )
+
+
+@pytest.mark.sql_engine_snapshot
+def test_derived_metric_same_alias_components_not_combined(
+ request: FixtureRequest,
+ mf_test_configuration: MetricFlowTestConfiguration,
+ dataflow_plan_builder: DataflowPlanBuilder,
+) -> None:
+ """Tests optimization of querying 2 metrics which give the same alias different things in their components.
+
+ In this case we should NOT combine source nodes, since this would generate two columns with
+ the same alias.
+ """
+ check_optimization(
+ request=request,
+ mf_test_configuration=mf_test_configuration,
+ dataflow_plan_builder=dataflow_plan_builder,
+ query_spec=MetricFlowQuerySpec(
+ metric_specs=(
+ MetricSpec(element_name="derived_shared_alias_1a"),
+ MetricSpec(element_name="derived_shared_alias_2"),
+ ),
+ dimension_specs=(DimensionSpec(element_name="is_instant", entity_links=(EntityReference("booking"),)),),
+ ),
+ expected_num_sources_in_unoptimized=2,
+ expected_num_sources_in_optimized=2,
+ )
+
+
@pytest.mark.sql_engine_snapshot
def test_2_ratio_metrics_from_1_semantic_model(
request: FixtureRequest,
diff --git a/tests_metricflow/integration/test_cases/itest_metrics.yaml b/tests_metricflow/integration/test_cases/itest_metrics.yaml
index cd9fb47c2e..d0d4011611 100644
--- a/tests_metricflow/integration/test_cases/itest_metrics.yaml
+++ b/tests_metricflow/integration/test_cases/itest_metrics.yaml
@@ -551,6 +551,34 @@ integration_test:
ds
) a
---
+integration_test:
+ name: shared_alias_derived_metric_same
+ description: Tests derived metrics which use the same alias for the same thing
+ model: SIMPLE_MODEL
+ metrics: ["derived_shared_alias_1a", "derived_shared_alias_1b"]
+ group_bys: ["booking__is_instant"]
+ check_query: |
+ SELECT
+ is_instant AS booking__is_instant
+ , COUNT(*) - 10 AS derived_shared_alias_1a
+ , COUNT(*) - 100 AS derived_shared_alias_1b
+ FROM {{ source_schema }}.fct_bookings
+ GROUP BY 1
+---
+integration_test:
+ name: shared_alias_derived_metric_different
+ description: Tests derived metrics which use the same alias for different things
+ model: SIMPLE_MODEL
+ metrics: ["derived_shared_alias_1a", "derived_shared_alias_2"]
+ group_bys: ["booking__is_instant"]
+ check_query: |
+ SELECT
+ is_instant AS booking__is_instant
+ , COUNT(*) - 10 AS derived_shared_alias_1a
+ , SUM(CASE WHEN is_instant THEN 1 ELSE 0 END) + 10 AS derived_shared_alias_2
+ FROM {{ source_schema }}.fct_bookings
+ GROUP BY 1
+---
integration_test:
name: two_metrics_with_null_dimension_values
description: Tests querying two metrics with a dimension having a NULL values
diff --git a/tests_metricflow/query_rendering/test_derived_metric_rendering.py b/tests_metricflow/query_rendering/test_derived_metric_rendering.py
index 0ba001c0c2..b0985915fc 100644
--- a/tests_metricflow/query_rendering/test_derived_metric_rendering.py
+++ b/tests_metricflow/query_rendering/test_derived_metric_rendering.py
@@ -795,3 +795,29 @@ def test_offset_to_grain_metric_filter_and_query_have_different_granularities(
dataflow_plan_builder=dataflow_plan_builder,
query_spec=query_spec,
)
+
+
+@pytest.mark.sql_engine_snapshot
+def test_derived_metric_that_defines_the_same_alias_in_different_components(
+ request: FixtureRequest,
+ mf_test_configuration: MetricFlowTestConfiguration,
+ dataflow_plan_builder: DataflowPlanBuilder,
+ query_parser: MetricFlowQueryParser,
+ sql_client: SqlClient,
+ dataflow_to_sql_converter: DataflowToSqlQueryPlanConverter,
+) -> None:
+ """Tests querying a derived metric which give the same alias to its components."""
+ query_spec = query_parser.parse_and_validate_query(
+ metric_names=("derived_shared_alias_1a", "derived_shared_alias_2"),
+ group_by_names=("booking__is_instant",),
+ limit=1,
+ ).query_spec
+
+ render_and_check(
+ request=request,
+ mf_test_configuration=mf_test_configuration,
+ dataflow_to_sql_converter=dataflow_to_sql_converter,
+ sql_client=sql_client,
+ dataflow_plan_builder=dataflow_plan_builder,
+ query_spec=query_spec,
+ )
diff --git a/tests_metricflow/snapshots/test_derived_metric_rendering.py/SqlQueryPlan/BigQuery/test_derived_metric_that_defines_the_same_alias_in_different_components__plan0.sql b/tests_metricflow/snapshots/test_derived_metric_rendering.py/SqlQueryPlan/BigQuery/test_derived_metric_that_defines_the_same_alias_in_different_components__plan0.sql
new file mode 100644
index 0000000000..050701880f
--- /dev/null
+++ b/tests_metricflow/snapshots/test_derived_metric_rendering.py/SqlQueryPlan/BigQuery/test_derived_metric_that_defines_the_same_alias_in_different_components__plan0.sql
@@ -0,0 +1,459 @@
+-- Order By [] Limit 1
+SELECT
+ subq_12.booking__is_instant
+ , subq_12.derived_shared_alias_1a
+ , subq_12.derived_shared_alias_2
+FROM (
+ -- Combine Aggregated Outputs
+ SELECT
+ COALESCE(subq_5.booking__is_instant, subq_11.booking__is_instant) AS booking__is_instant
+ , MAX(subq_5.derived_shared_alias_1a) AS derived_shared_alias_1a
+ , MAX(subq_11.derived_shared_alias_2) AS derived_shared_alias_2
+ FROM (
+ -- Compute Metrics via Expressions
+ SELECT
+ subq_4.booking__is_instant
+ , shared_alias - 10 AS derived_shared_alias_1a
+ FROM (
+ -- Compute Metrics via Expressions
+ SELECT
+ subq_3.booking__is_instant
+ , subq_3.bookings AS shared_alias
+ FROM (
+ -- Aggregate Measures
+ SELECT
+ subq_2.booking__is_instant
+ , SUM(subq_2.bookings) AS bookings
+ FROM (
+ -- Pass Only Elements: ['bookings', 'booking__is_instant']
+ SELECT
+ subq_1.booking__is_instant
+ , subq_1.bookings
+ FROM (
+ -- Metric Time Dimension 'ds'
+ SELECT
+ subq_0.ds__day
+ , subq_0.ds__week
+ , subq_0.ds__month
+ , subq_0.ds__quarter
+ , subq_0.ds__year
+ , subq_0.ds__extract_year
+ , subq_0.ds__extract_quarter
+ , subq_0.ds__extract_month
+ , subq_0.ds__extract_day
+ , subq_0.ds__extract_dow
+ , subq_0.ds__extract_doy
+ , subq_0.ds_partitioned__day
+ , subq_0.ds_partitioned__week
+ , subq_0.ds_partitioned__month
+ , subq_0.ds_partitioned__quarter
+ , subq_0.ds_partitioned__year
+ , subq_0.ds_partitioned__extract_year
+ , subq_0.ds_partitioned__extract_quarter
+ , subq_0.ds_partitioned__extract_month
+ , subq_0.ds_partitioned__extract_day
+ , subq_0.ds_partitioned__extract_dow
+ , subq_0.ds_partitioned__extract_doy
+ , subq_0.paid_at__day
+ , subq_0.paid_at__week
+ , subq_0.paid_at__month
+ , subq_0.paid_at__quarter
+ , subq_0.paid_at__year
+ , subq_0.paid_at__extract_year
+ , subq_0.paid_at__extract_quarter
+ , subq_0.paid_at__extract_month
+ , subq_0.paid_at__extract_day
+ , subq_0.paid_at__extract_dow
+ , subq_0.paid_at__extract_doy
+ , subq_0.booking__ds__day
+ , subq_0.booking__ds__week
+ , subq_0.booking__ds__month
+ , subq_0.booking__ds__quarter
+ , subq_0.booking__ds__year
+ , subq_0.booking__ds__extract_year
+ , subq_0.booking__ds__extract_quarter
+ , subq_0.booking__ds__extract_month
+ , subq_0.booking__ds__extract_day
+ , subq_0.booking__ds__extract_dow
+ , subq_0.booking__ds__extract_doy
+ , subq_0.booking__ds_partitioned__day
+ , subq_0.booking__ds_partitioned__week
+ , subq_0.booking__ds_partitioned__month
+ , subq_0.booking__ds_partitioned__quarter
+ , subq_0.booking__ds_partitioned__year
+ , subq_0.booking__ds_partitioned__extract_year
+ , subq_0.booking__ds_partitioned__extract_quarter
+ , subq_0.booking__ds_partitioned__extract_month
+ , subq_0.booking__ds_partitioned__extract_day
+ , subq_0.booking__ds_partitioned__extract_dow
+ , subq_0.booking__ds_partitioned__extract_doy
+ , subq_0.booking__paid_at__day
+ , subq_0.booking__paid_at__week
+ , subq_0.booking__paid_at__month
+ , subq_0.booking__paid_at__quarter
+ , subq_0.booking__paid_at__year
+ , subq_0.booking__paid_at__extract_year
+ , subq_0.booking__paid_at__extract_quarter
+ , subq_0.booking__paid_at__extract_month
+ , subq_0.booking__paid_at__extract_day
+ , subq_0.booking__paid_at__extract_dow
+ , subq_0.booking__paid_at__extract_doy
+ , subq_0.ds__day AS metric_time__day
+ , subq_0.ds__week AS metric_time__week
+ , subq_0.ds__month AS metric_time__month
+ , subq_0.ds__quarter AS metric_time__quarter
+ , subq_0.ds__year AS metric_time__year
+ , subq_0.ds__extract_year AS metric_time__extract_year
+ , subq_0.ds__extract_quarter AS metric_time__extract_quarter
+ , subq_0.ds__extract_month AS metric_time__extract_month
+ , subq_0.ds__extract_day AS metric_time__extract_day
+ , subq_0.ds__extract_dow AS metric_time__extract_dow
+ , subq_0.ds__extract_doy AS metric_time__extract_doy
+ , subq_0.listing
+ , subq_0.guest
+ , subq_0.host
+ , subq_0.booking__listing
+ , subq_0.booking__guest
+ , subq_0.booking__host
+ , subq_0.is_instant
+ , subq_0.booking__is_instant
+ , subq_0.bookings
+ , subq_0.instant_bookings
+ , subq_0.booking_value
+ , subq_0.max_booking_value
+ , subq_0.min_booking_value
+ , subq_0.bookers
+ , subq_0.average_booking_value
+ , subq_0.referred_bookings
+ , subq_0.median_booking_value
+ , subq_0.booking_value_p99
+ , subq_0.discrete_booking_value_p99
+ , subq_0.approximate_continuous_booking_value_p99
+ , subq_0.approximate_discrete_booking_value_p99
+ FROM (
+ -- Read Elements From Semantic Model 'bookings_source'
+ SELECT
+ 1 AS bookings
+ , CASE WHEN is_instant THEN 1 ELSE 0 END AS instant_bookings
+ , bookings_source_src_28000.booking_value
+ , bookings_source_src_28000.booking_value AS max_booking_value
+ , bookings_source_src_28000.booking_value AS min_booking_value
+ , bookings_source_src_28000.guest_id AS bookers
+ , bookings_source_src_28000.booking_value AS average_booking_value
+ , bookings_source_src_28000.booking_value AS booking_payments
+ , CASE WHEN referrer_id IS NOT NULL THEN 1 ELSE 0 END AS referred_bookings
+ , bookings_source_src_28000.booking_value AS median_booking_value
+ , bookings_source_src_28000.booking_value AS booking_value_p99
+ , bookings_source_src_28000.booking_value AS discrete_booking_value_p99
+ , bookings_source_src_28000.booking_value AS approximate_continuous_booking_value_p99
+ , bookings_source_src_28000.booking_value AS approximate_discrete_booking_value_p99
+ , bookings_source_src_28000.is_instant
+ , DATETIME_TRUNC(bookings_source_src_28000.ds, day) AS ds__day
+ , DATETIME_TRUNC(bookings_source_src_28000.ds, isoweek) AS ds__week
+ , DATETIME_TRUNC(bookings_source_src_28000.ds, month) AS ds__month
+ , DATETIME_TRUNC(bookings_source_src_28000.ds, quarter) AS ds__quarter
+ , DATETIME_TRUNC(bookings_source_src_28000.ds, year) AS ds__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds) AS ds__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds) AS ds__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds) AS ds__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds) AS ds__extract_day
+ , IF(EXTRACT(dayofweek FROM bookings_source_src_28000.ds) = 1, 7, EXTRACT(dayofweek FROM bookings_source_src_28000.ds) - 1) AS ds__extract_dow
+ , EXTRACT(dayofyear FROM bookings_source_src_28000.ds) AS ds__extract_doy
+ , DATETIME_TRUNC(bookings_source_src_28000.ds_partitioned, day) AS ds_partitioned__day
+ , DATETIME_TRUNC(bookings_source_src_28000.ds_partitioned, isoweek) AS ds_partitioned__week
+ , DATETIME_TRUNC(bookings_source_src_28000.ds_partitioned, month) AS ds_partitioned__month
+ , DATETIME_TRUNC(bookings_source_src_28000.ds_partitioned, quarter) AS ds_partitioned__quarter
+ , DATETIME_TRUNC(bookings_source_src_28000.ds_partitioned, year) AS ds_partitioned__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_day
+ , IF(EXTRACT(dayofweek FROM bookings_source_src_28000.ds_partitioned) = 1, 7, EXTRACT(dayofweek FROM bookings_source_src_28000.ds_partitioned) - 1) AS ds_partitioned__extract_dow
+ , EXTRACT(dayofyear FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_doy
+ , DATETIME_TRUNC(bookings_source_src_28000.paid_at, day) AS paid_at__day
+ , DATETIME_TRUNC(bookings_source_src_28000.paid_at, isoweek) AS paid_at__week
+ , DATETIME_TRUNC(bookings_source_src_28000.paid_at, month) AS paid_at__month
+ , DATETIME_TRUNC(bookings_source_src_28000.paid_at, quarter) AS paid_at__quarter
+ , DATETIME_TRUNC(bookings_source_src_28000.paid_at, year) AS paid_at__year
+ , EXTRACT(year FROM bookings_source_src_28000.paid_at) AS paid_at__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.paid_at) AS paid_at__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.paid_at) AS paid_at__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.paid_at) AS paid_at__extract_day
+ , IF(EXTRACT(dayofweek FROM bookings_source_src_28000.paid_at) = 1, 7, EXTRACT(dayofweek FROM bookings_source_src_28000.paid_at) - 1) AS paid_at__extract_dow
+ , EXTRACT(dayofyear FROM bookings_source_src_28000.paid_at) AS paid_at__extract_doy
+ , bookings_source_src_28000.is_instant AS booking__is_instant
+ , DATETIME_TRUNC(bookings_source_src_28000.ds, day) AS booking__ds__day
+ , DATETIME_TRUNC(bookings_source_src_28000.ds, isoweek) AS booking__ds__week
+ , DATETIME_TRUNC(bookings_source_src_28000.ds, month) AS booking__ds__month
+ , DATETIME_TRUNC(bookings_source_src_28000.ds, quarter) AS booking__ds__quarter
+ , DATETIME_TRUNC(bookings_source_src_28000.ds, year) AS booking__ds__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds) AS booking__ds__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds) AS booking__ds__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds) AS booking__ds__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds) AS booking__ds__extract_day
+ , IF(EXTRACT(dayofweek FROM bookings_source_src_28000.ds) = 1, 7, EXTRACT(dayofweek FROM bookings_source_src_28000.ds) - 1) AS booking__ds__extract_dow
+ , EXTRACT(dayofyear FROM bookings_source_src_28000.ds) AS booking__ds__extract_doy
+ , DATETIME_TRUNC(bookings_source_src_28000.ds_partitioned, day) AS booking__ds_partitioned__day
+ , DATETIME_TRUNC(bookings_source_src_28000.ds_partitioned, isoweek) AS booking__ds_partitioned__week
+ , DATETIME_TRUNC(bookings_source_src_28000.ds_partitioned, month) AS booking__ds_partitioned__month
+ , DATETIME_TRUNC(bookings_source_src_28000.ds_partitioned, quarter) AS booking__ds_partitioned__quarter
+ , DATETIME_TRUNC(bookings_source_src_28000.ds_partitioned, year) AS booking__ds_partitioned__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_day
+ , IF(EXTRACT(dayofweek FROM bookings_source_src_28000.ds_partitioned) = 1, 7, EXTRACT(dayofweek FROM bookings_source_src_28000.ds_partitioned) - 1) AS booking__ds_partitioned__extract_dow
+ , EXTRACT(dayofyear FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_doy
+ , DATETIME_TRUNC(bookings_source_src_28000.paid_at, day) AS booking__paid_at__day
+ , DATETIME_TRUNC(bookings_source_src_28000.paid_at, isoweek) AS booking__paid_at__week
+ , DATETIME_TRUNC(bookings_source_src_28000.paid_at, month) AS booking__paid_at__month
+ , DATETIME_TRUNC(bookings_source_src_28000.paid_at, quarter) AS booking__paid_at__quarter
+ , DATETIME_TRUNC(bookings_source_src_28000.paid_at, year) AS booking__paid_at__year
+ , EXTRACT(year FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_day
+ , IF(EXTRACT(dayofweek FROM bookings_source_src_28000.paid_at) = 1, 7, EXTRACT(dayofweek FROM bookings_source_src_28000.paid_at) - 1) AS booking__paid_at__extract_dow
+ , EXTRACT(dayofyear FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_doy
+ , bookings_source_src_28000.listing_id AS listing
+ , bookings_source_src_28000.guest_id AS guest
+ , bookings_source_src_28000.host_id AS host
+ , bookings_source_src_28000.listing_id AS booking__listing
+ , bookings_source_src_28000.guest_id AS booking__guest
+ , bookings_source_src_28000.host_id AS booking__host
+ FROM ***************************.fct_bookings bookings_source_src_28000
+ ) subq_0
+ ) subq_1
+ ) subq_2
+ GROUP BY
+ booking__is_instant
+ ) subq_3
+ ) subq_4
+ ) subq_5
+ FULL OUTER JOIN (
+ -- Compute Metrics via Expressions
+ SELECT
+ subq_10.booking__is_instant
+ , shared_alias + 10 AS derived_shared_alias_2
+ FROM (
+ -- Compute Metrics via Expressions
+ SELECT
+ subq_9.booking__is_instant
+ , subq_9.instant_bookings AS shared_alias
+ FROM (
+ -- Aggregate Measures
+ SELECT
+ subq_8.booking__is_instant
+ , SUM(subq_8.instant_bookings) AS instant_bookings
+ FROM (
+ -- Pass Only Elements: ['instant_bookings', 'booking__is_instant']
+ SELECT
+ subq_7.booking__is_instant
+ , subq_7.instant_bookings
+ FROM (
+ -- Metric Time Dimension 'ds'
+ SELECT
+ subq_6.ds__day
+ , subq_6.ds__week
+ , subq_6.ds__month
+ , subq_6.ds__quarter
+ , subq_6.ds__year
+ , subq_6.ds__extract_year
+ , subq_6.ds__extract_quarter
+ , subq_6.ds__extract_month
+ , subq_6.ds__extract_day
+ , subq_6.ds__extract_dow
+ , subq_6.ds__extract_doy
+ , subq_6.ds_partitioned__day
+ , subq_6.ds_partitioned__week
+ , subq_6.ds_partitioned__month
+ , subq_6.ds_partitioned__quarter
+ , subq_6.ds_partitioned__year
+ , subq_6.ds_partitioned__extract_year
+ , subq_6.ds_partitioned__extract_quarter
+ , subq_6.ds_partitioned__extract_month
+ , subq_6.ds_partitioned__extract_day
+ , subq_6.ds_partitioned__extract_dow
+ , subq_6.ds_partitioned__extract_doy
+ , subq_6.paid_at__day
+ , subq_6.paid_at__week
+ , subq_6.paid_at__month
+ , subq_6.paid_at__quarter
+ , subq_6.paid_at__year
+ , subq_6.paid_at__extract_year
+ , subq_6.paid_at__extract_quarter
+ , subq_6.paid_at__extract_month
+ , subq_6.paid_at__extract_day
+ , subq_6.paid_at__extract_dow
+ , subq_6.paid_at__extract_doy
+ , subq_6.booking__ds__day
+ , subq_6.booking__ds__week
+ , subq_6.booking__ds__month
+ , subq_6.booking__ds__quarter
+ , subq_6.booking__ds__year
+ , subq_6.booking__ds__extract_year
+ , subq_6.booking__ds__extract_quarter
+ , subq_6.booking__ds__extract_month
+ , subq_6.booking__ds__extract_day
+ , subq_6.booking__ds__extract_dow
+ , subq_6.booking__ds__extract_doy
+ , subq_6.booking__ds_partitioned__day
+ , subq_6.booking__ds_partitioned__week
+ , subq_6.booking__ds_partitioned__month
+ , subq_6.booking__ds_partitioned__quarter
+ , subq_6.booking__ds_partitioned__year
+ , subq_6.booking__ds_partitioned__extract_year
+ , subq_6.booking__ds_partitioned__extract_quarter
+ , subq_6.booking__ds_partitioned__extract_month
+ , subq_6.booking__ds_partitioned__extract_day
+ , subq_6.booking__ds_partitioned__extract_dow
+ , subq_6.booking__ds_partitioned__extract_doy
+ , subq_6.booking__paid_at__day
+ , subq_6.booking__paid_at__week
+ , subq_6.booking__paid_at__month
+ , subq_6.booking__paid_at__quarter
+ , subq_6.booking__paid_at__year
+ , subq_6.booking__paid_at__extract_year
+ , subq_6.booking__paid_at__extract_quarter
+ , subq_6.booking__paid_at__extract_month
+ , subq_6.booking__paid_at__extract_day
+ , subq_6.booking__paid_at__extract_dow
+ , subq_6.booking__paid_at__extract_doy
+ , subq_6.ds__day AS metric_time__day
+ , subq_6.ds__week AS metric_time__week
+ , subq_6.ds__month AS metric_time__month
+ , subq_6.ds__quarter AS metric_time__quarter
+ , subq_6.ds__year AS metric_time__year
+ , subq_6.ds__extract_year AS metric_time__extract_year
+ , subq_6.ds__extract_quarter AS metric_time__extract_quarter
+ , subq_6.ds__extract_month AS metric_time__extract_month
+ , subq_6.ds__extract_day AS metric_time__extract_day
+ , subq_6.ds__extract_dow AS metric_time__extract_dow
+ , subq_6.ds__extract_doy AS metric_time__extract_doy
+ , subq_6.listing
+ , subq_6.guest
+ , subq_6.host
+ , subq_6.booking__listing
+ , subq_6.booking__guest
+ , subq_6.booking__host
+ , subq_6.is_instant
+ , subq_6.booking__is_instant
+ , subq_6.bookings
+ , subq_6.instant_bookings
+ , subq_6.booking_value
+ , subq_6.max_booking_value
+ , subq_6.min_booking_value
+ , subq_6.bookers
+ , subq_6.average_booking_value
+ , subq_6.referred_bookings
+ , subq_6.median_booking_value
+ , subq_6.booking_value_p99
+ , subq_6.discrete_booking_value_p99
+ , subq_6.approximate_continuous_booking_value_p99
+ , subq_6.approximate_discrete_booking_value_p99
+ FROM (
+ -- Read Elements From Semantic Model 'bookings_source'
+ SELECT
+ 1 AS bookings
+ , CASE WHEN is_instant THEN 1 ELSE 0 END AS instant_bookings
+ , bookings_source_src_28000.booking_value
+ , bookings_source_src_28000.booking_value AS max_booking_value
+ , bookings_source_src_28000.booking_value AS min_booking_value
+ , bookings_source_src_28000.guest_id AS bookers
+ , bookings_source_src_28000.booking_value AS average_booking_value
+ , bookings_source_src_28000.booking_value AS booking_payments
+ , CASE WHEN referrer_id IS NOT NULL THEN 1 ELSE 0 END AS referred_bookings
+ , bookings_source_src_28000.booking_value AS median_booking_value
+ , bookings_source_src_28000.booking_value AS booking_value_p99
+ , bookings_source_src_28000.booking_value AS discrete_booking_value_p99
+ , bookings_source_src_28000.booking_value AS approximate_continuous_booking_value_p99
+ , bookings_source_src_28000.booking_value AS approximate_discrete_booking_value_p99
+ , bookings_source_src_28000.is_instant
+ , DATETIME_TRUNC(bookings_source_src_28000.ds, day) AS ds__day
+ , DATETIME_TRUNC(bookings_source_src_28000.ds, isoweek) AS ds__week
+ , DATETIME_TRUNC(bookings_source_src_28000.ds, month) AS ds__month
+ , DATETIME_TRUNC(bookings_source_src_28000.ds, quarter) AS ds__quarter
+ , DATETIME_TRUNC(bookings_source_src_28000.ds, year) AS ds__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds) AS ds__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds) AS ds__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds) AS ds__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds) AS ds__extract_day
+ , IF(EXTRACT(dayofweek FROM bookings_source_src_28000.ds) = 1, 7, EXTRACT(dayofweek FROM bookings_source_src_28000.ds) - 1) AS ds__extract_dow
+ , EXTRACT(dayofyear FROM bookings_source_src_28000.ds) AS ds__extract_doy
+ , DATETIME_TRUNC(bookings_source_src_28000.ds_partitioned, day) AS ds_partitioned__day
+ , DATETIME_TRUNC(bookings_source_src_28000.ds_partitioned, isoweek) AS ds_partitioned__week
+ , DATETIME_TRUNC(bookings_source_src_28000.ds_partitioned, month) AS ds_partitioned__month
+ , DATETIME_TRUNC(bookings_source_src_28000.ds_partitioned, quarter) AS ds_partitioned__quarter
+ , DATETIME_TRUNC(bookings_source_src_28000.ds_partitioned, year) AS ds_partitioned__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_day
+ , IF(EXTRACT(dayofweek FROM bookings_source_src_28000.ds_partitioned) = 1, 7, EXTRACT(dayofweek FROM bookings_source_src_28000.ds_partitioned) - 1) AS ds_partitioned__extract_dow
+ , EXTRACT(dayofyear FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_doy
+ , DATETIME_TRUNC(bookings_source_src_28000.paid_at, day) AS paid_at__day
+ , DATETIME_TRUNC(bookings_source_src_28000.paid_at, isoweek) AS paid_at__week
+ , DATETIME_TRUNC(bookings_source_src_28000.paid_at, month) AS paid_at__month
+ , DATETIME_TRUNC(bookings_source_src_28000.paid_at, quarter) AS paid_at__quarter
+ , DATETIME_TRUNC(bookings_source_src_28000.paid_at, year) AS paid_at__year
+ , EXTRACT(year FROM bookings_source_src_28000.paid_at) AS paid_at__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.paid_at) AS paid_at__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.paid_at) AS paid_at__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.paid_at) AS paid_at__extract_day
+ , IF(EXTRACT(dayofweek FROM bookings_source_src_28000.paid_at) = 1, 7, EXTRACT(dayofweek FROM bookings_source_src_28000.paid_at) - 1) AS paid_at__extract_dow
+ , EXTRACT(dayofyear FROM bookings_source_src_28000.paid_at) AS paid_at__extract_doy
+ , bookings_source_src_28000.is_instant AS booking__is_instant
+ , DATETIME_TRUNC(bookings_source_src_28000.ds, day) AS booking__ds__day
+ , DATETIME_TRUNC(bookings_source_src_28000.ds, isoweek) AS booking__ds__week
+ , DATETIME_TRUNC(bookings_source_src_28000.ds, month) AS booking__ds__month
+ , DATETIME_TRUNC(bookings_source_src_28000.ds, quarter) AS booking__ds__quarter
+ , DATETIME_TRUNC(bookings_source_src_28000.ds, year) AS booking__ds__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds) AS booking__ds__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds) AS booking__ds__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds) AS booking__ds__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds) AS booking__ds__extract_day
+ , IF(EXTRACT(dayofweek FROM bookings_source_src_28000.ds) = 1, 7, EXTRACT(dayofweek FROM bookings_source_src_28000.ds) - 1) AS booking__ds__extract_dow
+ , EXTRACT(dayofyear FROM bookings_source_src_28000.ds) AS booking__ds__extract_doy
+ , DATETIME_TRUNC(bookings_source_src_28000.ds_partitioned, day) AS booking__ds_partitioned__day
+ , DATETIME_TRUNC(bookings_source_src_28000.ds_partitioned, isoweek) AS booking__ds_partitioned__week
+ , DATETIME_TRUNC(bookings_source_src_28000.ds_partitioned, month) AS booking__ds_partitioned__month
+ , DATETIME_TRUNC(bookings_source_src_28000.ds_partitioned, quarter) AS booking__ds_partitioned__quarter
+ , DATETIME_TRUNC(bookings_source_src_28000.ds_partitioned, year) AS booking__ds_partitioned__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_day
+ , IF(EXTRACT(dayofweek FROM bookings_source_src_28000.ds_partitioned) = 1, 7, EXTRACT(dayofweek FROM bookings_source_src_28000.ds_partitioned) - 1) AS booking__ds_partitioned__extract_dow
+ , EXTRACT(dayofyear FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_doy
+ , DATETIME_TRUNC(bookings_source_src_28000.paid_at, day) AS booking__paid_at__day
+ , DATETIME_TRUNC(bookings_source_src_28000.paid_at, isoweek) AS booking__paid_at__week
+ , DATETIME_TRUNC(bookings_source_src_28000.paid_at, month) AS booking__paid_at__month
+ , DATETIME_TRUNC(bookings_source_src_28000.paid_at, quarter) AS booking__paid_at__quarter
+ , DATETIME_TRUNC(bookings_source_src_28000.paid_at, year) AS booking__paid_at__year
+ , EXTRACT(year FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_day
+ , IF(EXTRACT(dayofweek FROM bookings_source_src_28000.paid_at) = 1, 7, EXTRACT(dayofweek FROM bookings_source_src_28000.paid_at) - 1) AS booking__paid_at__extract_dow
+ , EXTRACT(dayofyear FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_doy
+ , bookings_source_src_28000.listing_id AS listing
+ , bookings_source_src_28000.guest_id AS guest
+ , bookings_source_src_28000.host_id AS host
+ , bookings_source_src_28000.listing_id AS booking__listing
+ , bookings_source_src_28000.guest_id AS booking__guest
+ , bookings_source_src_28000.host_id AS booking__host
+ FROM ***************************.fct_bookings bookings_source_src_28000
+ ) subq_6
+ ) subq_7
+ ) subq_8
+ GROUP BY
+ booking__is_instant
+ ) subq_9
+ ) subq_10
+ ) subq_11
+ ON
+ subq_5.booking__is_instant = subq_11.booking__is_instant
+ GROUP BY
+ booking__is_instant
+) subq_12
+LIMIT 1
diff --git a/tests_metricflow/snapshots/test_derived_metric_rendering.py/SqlQueryPlan/BigQuery/test_derived_metric_that_defines_the_same_alias_in_different_components__plan0_optimized.sql b/tests_metricflow/snapshots/test_derived_metric_rendering.py/SqlQueryPlan/BigQuery/test_derived_metric_that_defines_the_same_alias_in_different_components__plan0_optimized.sql
new file mode 100644
index 0000000000..d8fa84156d
--- /dev/null
+++ b/tests_metricflow/snapshots/test_derived_metric_rendering.py/SqlQueryPlan/BigQuery/test_derived_metric_that_defines_the_same_alias_in_different_components__plan0_optimized.sql
@@ -0,0 +1,59 @@
+-- Combine Aggregated Outputs
+-- Order By [] Limit 1
+SELECT
+ COALESCE(subq_18.booking__is_instant, subq_24.booking__is_instant) AS booking__is_instant
+ , MAX(subq_18.derived_shared_alias_1a) AS derived_shared_alias_1a
+ , MAX(subq_24.derived_shared_alias_2) AS derived_shared_alias_2
+FROM (
+ -- Compute Metrics via Expressions
+ SELECT
+ booking__is_instant
+ , shared_alias - 10 AS derived_shared_alias_1a
+ FROM (
+ -- Aggregate Measures
+ -- Compute Metrics via Expressions
+ SELECT
+ booking__is_instant
+ , SUM(bookings) AS shared_alias
+ FROM (
+ -- Read Elements From Semantic Model 'bookings_source'
+ -- Metric Time Dimension 'ds'
+ -- Pass Only Elements: ['bookings', 'booking__is_instant']
+ SELECT
+ is_instant AS booking__is_instant
+ , 1 AS bookings
+ FROM ***************************.fct_bookings bookings_source_src_28000
+ ) subq_15
+ GROUP BY
+ booking__is_instant
+ ) subq_17
+) subq_18
+FULL OUTER JOIN (
+ -- Compute Metrics via Expressions
+ SELECT
+ booking__is_instant
+ , shared_alias + 10 AS derived_shared_alias_2
+ FROM (
+ -- Aggregate Measures
+ -- Compute Metrics via Expressions
+ SELECT
+ booking__is_instant
+ , SUM(instant_bookings) AS shared_alias
+ FROM (
+ -- Read Elements From Semantic Model 'bookings_source'
+ -- Metric Time Dimension 'ds'
+ -- Pass Only Elements: ['instant_bookings', 'booking__is_instant']
+ SELECT
+ is_instant AS booking__is_instant
+ , CASE WHEN is_instant THEN 1 ELSE 0 END AS instant_bookings
+ FROM ***************************.fct_bookings bookings_source_src_28000
+ ) subq_21
+ GROUP BY
+ booking__is_instant
+ ) subq_23
+) subq_24
+ON
+ subq_18.booking__is_instant = subq_24.booking__is_instant
+GROUP BY
+ booking__is_instant
+LIMIT 1
diff --git a/tests_metricflow/snapshots/test_derived_metric_rendering.py/SqlQueryPlan/Databricks/test_derived_metric_that_defines_the_same_alias_in_different_components__plan0.sql b/tests_metricflow/snapshots/test_derived_metric_rendering.py/SqlQueryPlan/Databricks/test_derived_metric_that_defines_the_same_alias_in_different_components__plan0.sql
new file mode 100644
index 0000000000..aa6333fc05
--- /dev/null
+++ b/tests_metricflow/snapshots/test_derived_metric_rendering.py/SqlQueryPlan/Databricks/test_derived_metric_that_defines_the_same_alias_in_different_components__plan0.sql
@@ -0,0 +1,459 @@
+-- Order By [] Limit 1
+SELECT
+ subq_12.booking__is_instant
+ , subq_12.derived_shared_alias_1a
+ , subq_12.derived_shared_alias_2
+FROM (
+ -- Combine Aggregated Outputs
+ SELECT
+ COALESCE(subq_5.booking__is_instant, subq_11.booking__is_instant) AS booking__is_instant
+ , MAX(subq_5.derived_shared_alias_1a) AS derived_shared_alias_1a
+ , MAX(subq_11.derived_shared_alias_2) AS derived_shared_alias_2
+ FROM (
+ -- Compute Metrics via Expressions
+ SELECT
+ subq_4.booking__is_instant
+ , shared_alias - 10 AS derived_shared_alias_1a
+ FROM (
+ -- Compute Metrics via Expressions
+ SELECT
+ subq_3.booking__is_instant
+ , subq_3.bookings AS shared_alias
+ FROM (
+ -- Aggregate Measures
+ SELECT
+ subq_2.booking__is_instant
+ , SUM(subq_2.bookings) AS bookings
+ FROM (
+ -- Pass Only Elements: ['bookings', 'booking__is_instant']
+ SELECT
+ subq_1.booking__is_instant
+ , subq_1.bookings
+ FROM (
+ -- Metric Time Dimension 'ds'
+ SELECT
+ subq_0.ds__day
+ , subq_0.ds__week
+ , subq_0.ds__month
+ , subq_0.ds__quarter
+ , subq_0.ds__year
+ , subq_0.ds__extract_year
+ , subq_0.ds__extract_quarter
+ , subq_0.ds__extract_month
+ , subq_0.ds__extract_day
+ , subq_0.ds__extract_dow
+ , subq_0.ds__extract_doy
+ , subq_0.ds_partitioned__day
+ , subq_0.ds_partitioned__week
+ , subq_0.ds_partitioned__month
+ , subq_0.ds_partitioned__quarter
+ , subq_0.ds_partitioned__year
+ , subq_0.ds_partitioned__extract_year
+ , subq_0.ds_partitioned__extract_quarter
+ , subq_0.ds_partitioned__extract_month
+ , subq_0.ds_partitioned__extract_day
+ , subq_0.ds_partitioned__extract_dow
+ , subq_0.ds_partitioned__extract_doy
+ , subq_0.paid_at__day
+ , subq_0.paid_at__week
+ , subq_0.paid_at__month
+ , subq_0.paid_at__quarter
+ , subq_0.paid_at__year
+ , subq_0.paid_at__extract_year
+ , subq_0.paid_at__extract_quarter
+ , subq_0.paid_at__extract_month
+ , subq_0.paid_at__extract_day
+ , subq_0.paid_at__extract_dow
+ , subq_0.paid_at__extract_doy
+ , subq_0.booking__ds__day
+ , subq_0.booking__ds__week
+ , subq_0.booking__ds__month
+ , subq_0.booking__ds__quarter
+ , subq_0.booking__ds__year
+ , subq_0.booking__ds__extract_year
+ , subq_0.booking__ds__extract_quarter
+ , subq_0.booking__ds__extract_month
+ , subq_0.booking__ds__extract_day
+ , subq_0.booking__ds__extract_dow
+ , subq_0.booking__ds__extract_doy
+ , subq_0.booking__ds_partitioned__day
+ , subq_0.booking__ds_partitioned__week
+ , subq_0.booking__ds_partitioned__month
+ , subq_0.booking__ds_partitioned__quarter
+ , subq_0.booking__ds_partitioned__year
+ , subq_0.booking__ds_partitioned__extract_year
+ , subq_0.booking__ds_partitioned__extract_quarter
+ , subq_0.booking__ds_partitioned__extract_month
+ , subq_0.booking__ds_partitioned__extract_day
+ , subq_0.booking__ds_partitioned__extract_dow
+ , subq_0.booking__ds_partitioned__extract_doy
+ , subq_0.booking__paid_at__day
+ , subq_0.booking__paid_at__week
+ , subq_0.booking__paid_at__month
+ , subq_0.booking__paid_at__quarter
+ , subq_0.booking__paid_at__year
+ , subq_0.booking__paid_at__extract_year
+ , subq_0.booking__paid_at__extract_quarter
+ , subq_0.booking__paid_at__extract_month
+ , subq_0.booking__paid_at__extract_day
+ , subq_0.booking__paid_at__extract_dow
+ , subq_0.booking__paid_at__extract_doy
+ , subq_0.ds__day AS metric_time__day
+ , subq_0.ds__week AS metric_time__week
+ , subq_0.ds__month AS metric_time__month
+ , subq_0.ds__quarter AS metric_time__quarter
+ , subq_0.ds__year AS metric_time__year
+ , subq_0.ds__extract_year AS metric_time__extract_year
+ , subq_0.ds__extract_quarter AS metric_time__extract_quarter
+ , subq_0.ds__extract_month AS metric_time__extract_month
+ , subq_0.ds__extract_day AS metric_time__extract_day
+ , subq_0.ds__extract_dow AS metric_time__extract_dow
+ , subq_0.ds__extract_doy AS metric_time__extract_doy
+ , subq_0.listing
+ , subq_0.guest
+ , subq_0.host
+ , subq_0.booking__listing
+ , subq_0.booking__guest
+ , subq_0.booking__host
+ , subq_0.is_instant
+ , subq_0.booking__is_instant
+ , subq_0.bookings
+ , subq_0.instant_bookings
+ , subq_0.booking_value
+ , subq_0.max_booking_value
+ , subq_0.min_booking_value
+ , subq_0.bookers
+ , subq_0.average_booking_value
+ , subq_0.referred_bookings
+ , subq_0.median_booking_value
+ , subq_0.booking_value_p99
+ , subq_0.discrete_booking_value_p99
+ , subq_0.approximate_continuous_booking_value_p99
+ , subq_0.approximate_discrete_booking_value_p99
+ FROM (
+ -- Read Elements From Semantic Model 'bookings_source'
+ SELECT
+ 1 AS bookings
+ , CASE WHEN is_instant THEN 1 ELSE 0 END AS instant_bookings
+ , bookings_source_src_28000.booking_value
+ , bookings_source_src_28000.booking_value AS max_booking_value
+ , bookings_source_src_28000.booking_value AS min_booking_value
+ , bookings_source_src_28000.guest_id AS bookers
+ , bookings_source_src_28000.booking_value AS average_booking_value
+ , bookings_source_src_28000.booking_value AS booking_payments
+ , CASE WHEN referrer_id IS NOT NULL THEN 1 ELSE 0 END AS referred_bookings
+ , bookings_source_src_28000.booking_value AS median_booking_value
+ , bookings_source_src_28000.booking_value AS booking_value_p99
+ , bookings_source_src_28000.booking_value AS discrete_booking_value_p99
+ , bookings_source_src_28000.booking_value AS approximate_continuous_booking_value_p99
+ , bookings_source_src_28000.booking_value AS approximate_discrete_booking_value_p99
+ , bookings_source_src_28000.is_instant
+ , DATE_TRUNC('day', bookings_source_src_28000.ds) AS ds__day
+ , DATE_TRUNC('week', bookings_source_src_28000.ds) AS ds__week
+ , DATE_TRUNC('month', bookings_source_src_28000.ds) AS ds__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.ds) AS ds__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.ds) AS ds__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds) AS ds__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds) AS ds__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds) AS ds__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds) AS ds__extract_day
+ , EXTRACT(DAYOFWEEK_ISO FROM bookings_source_src_28000.ds) AS ds__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.ds) AS ds__extract_doy
+ , DATE_TRUNC('day', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__day
+ , DATE_TRUNC('week', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__week
+ , DATE_TRUNC('month', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_day
+ , EXTRACT(DAYOFWEEK_ISO FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_doy
+ , DATE_TRUNC('day', bookings_source_src_28000.paid_at) AS paid_at__day
+ , DATE_TRUNC('week', bookings_source_src_28000.paid_at) AS paid_at__week
+ , DATE_TRUNC('month', bookings_source_src_28000.paid_at) AS paid_at__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.paid_at) AS paid_at__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.paid_at) AS paid_at__year
+ , EXTRACT(year FROM bookings_source_src_28000.paid_at) AS paid_at__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.paid_at) AS paid_at__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.paid_at) AS paid_at__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.paid_at) AS paid_at__extract_day
+ , EXTRACT(DAYOFWEEK_ISO FROM bookings_source_src_28000.paid_at) AS paid_at__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.paid_at) AS paid_at__extract_doy
+ , bookings_source_src_28000.is_instant AS booking__is_instant
+ , DATE_TRUNC('day', bookings_source_src_28000.ds) AS booking__ds__day
+ , DATE_TRUNC('week', bookings_source_src_28000.ds) AS booking__ds__week
+ , DATE_TRUNC('month', bookings_source_src_28000.ds) AS booking__ds__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.ds) AS booking__ds__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.ds) AS booking__ds__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds) AS booking__ds__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds) AS booking__ds__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds) AS booking__ds__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds) AS booking__ds__extract_day
+ , EXTRACT(DAYOFWEEK_ISO FROM bookings_source_src_28000.ds) AS booking__ds__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.ds) AS booking__ds__extract_doy
+ , DATE_TRUNC('day', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__day
+ , DATE_TRUNC('week', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__week
+ , DATE_TRUNC('month', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_day
+ , EXTRACT(DAYOFWEEK_ISO FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_doy
+ , DATE_TRUNC('day', bookings_source_src_28000.paid_at) AS booking__paid_at__day
+ , DATE_TRUNC('week', bookings_source_src_28000.paid_at) AS booking__paid_at__week
+ , DATE_TRUNC('month', bookings_source_src_28000.paid_at) AS booking__paid_at__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.paid_at) AS booking__paid_at__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.paid_at) AS booking__paid_at__year
+ , EXTRACT(year FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_day
+ , EXTRACT(DAYOFWEEK_ISO FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_doy
+ , bookings_source_src_28000.listing_id AS listing
+ , bookings_source_src_28000.guest_id AS guest
+ , bookings_source_src_28000.host_id AS host
+ , bookings_source_src_28000.listing_id AS booking__listing
+ , bookings_source_src_28000.guest_id AS booking__guest
+ , bookings_source_src_28000.host_id AS booking__host
+ FROM ***************************.fct_bookings bookings_source_src_28000
+ ) subq_0
+ ) subq_1
+ ) subq_2
+ GROUP BY
+ subq_2.booking__is_instant
+ ) subq_3
+ ) subq_4
+ ) subq_5
+ FULL OUTER JOIN (
+ -- Compute Metrics via Expressions
+ SELECT
+ subq_10.booking__is_instant
+ , shared_alias + 10 AS derived_shared_alias_2
+ FROM (
+ -- Compute Metrics via Expressions
+ SELECT
+ subq_9.booking__is_instant
+ , subq_9.instant_bookings AS shared_alias
+ FROM (
+ -- Aggregate Measures
+ SELECT
+ subq_8.booking__is_instant
+ , SUM(subq_8.instant_bookings) AS instant_bookings
+ FROM (
+ -- Pass Only Elements: ['instant_bookings', 'booking__is_instant']
+ SELECT
+ subq_7.booking__is_instant
+ , subq_7.instant_bookings
+ FROM (
+ -- Metric Time Dimension 'ds'
+ SELECT
+ subq_6.ds__day
+ , subq_6.ds__week
+ , subq_6.ds__month
+ , subq_6.ds__quarter
+ , subq_6.ds__year
+ , subq_6.ds__extract_year
+ , subq_6.ds__extract_quarter
+ , subq_6.ds__extract_month
+ , subq_6.ds__extract_day
+ , subq_6.ds__extract_dow
+ , subq_6.ds__extract_doy
+ , subq_6.ds_partitioned__day
+ , subq_6.ds_partitioned__week
+ , subq_6.ds_partitioned__month
+ , subq_6.ds_partitioned__quarter
+ , subq_6.ds_partitioned__year
+ , subq_6.ds_partitioned__extract_year
+ , subq_6.ds_partitioned__extract_quarter
+ , subq_6.ds_partitioned__extract_month
+ , subq_6.ds_partitioned__extract_day
+ , subq_6.ds_partitioned__extract_dow
+ , subq_6.ds_partitioned__extract_doy
+ , subq_6.paid_at__day
+ , subq_6.paid_at__week
+ , subq_6.paid_at__month
+ , subq_6.paid_at__quarter
+ , subq_6.paid_at__year
+ , subq_6.paid_at__extract_year
+ , subq_6.paid_at__extract_quarter
+ , subq_6.paid_at__extract_month
+ , subq_6.paid_at__extract_day
+ , subq_6.paid_at__extract_dow
+ , subq_6.paid_at__extract_doy
+ , subq_6.booking__ds__day
+ , subq_6.booking__ds__week
+ , subq_6.booking__ds__month
+ , subq_6.booking__ds__quarter
+ , subq_6.booking__ds__year
+ , subq_6.booking__ds__extract_year
+ , subq_6.booking__ds__extract_quarter
+ , subq_6.booking__ds__extract_month
+ , subq_6.booking__ds__extract_day
+ , subq_6.booking__ds__extract_dow
+ , subq_6.booking__ds__extract_doy
+ , subq_6.booking__ds_partitioned__day
+ , subq_6.booking__ds_partitioned__week
+ , subq_6.booking__ds_partitioned__month
+ , subq_6.booking__ds_partitioned__quarter
+ , subq_6.booking__ds_partitioned__year
+ , subq_6.booking__ds_partitioned__extract_year
+ , subq_6.booking__ds_partitioned__extract_quarter
+ , subq_6.booking__ds_partitioned__extract_month
+ , subq_6.booking__ds_partitioned__extract_day
+ , subq_6.booking__ds_partitioned__extract_dow
+ , subq_6.booking__ds_partitioned__extract_doy
+ , subq_6.booking__paid_at__day
+ , subq_6.booking__paid_at__week
+ , subq_6.booking__paid_at__month
+ , subq_6.booking__paid_at__quarter
+ , subq_6.booking__paid_at__year
+ , subq_6.booking__paid_at__extract_year
+ , subq_6.booking__paid_at__extract_quarter
+ , subq_6.booking__paid_at__extract_month
+ , subq_6.booking__paid_at__extract_day
+ , subq_6.booking__paid_at__extract_dow
+ , subq_6.booking__paid_at__extract_doy
+ , subq_6.ds__day AS metric_time__day
+ , subq_6.ds__week AS metric_time__week
+ , subq_6.ds__month AS metric_time__month
+ , subq_6.ds__quarter AS metric_time__quarter
+ , subq_6.ds__year AS metric_time__year
+ , subq_6.ds__extract_year AS metric_time__extract_year
+ , subq_6.ds__extract_quarter AS metric_time__extract_quarter
+ , subq_6.ds__extract_month AS metric_time__extract_month
+ , subq_6.ds__extract_day AS metric_time__extract_day
+ , subq_6.ds__extract_dow AS metric_time__extract_dow
+ , subq_6.ds__extract_doy AS metric_time__extract_doy
+ , subq_6.listing
+ , subq_6.guest
+ , subq_6.host
+ , subq_6.booking__listing
+ , subq_6.booking__guest
+ , subq_6.booking__host
+ , subq_6.is_instant
+ , subq_6.booking__is_instant
+ , subq_6.bookings
+ , subq_6.instant_bookings
+ , subq_6.booking_value
+ , subq_6.max_booking_value
+ , subq_6.min_booking_value
+ , subq_6.bookers
+ , subq_6.average_booking_value
+ , subq_6.referred_bookings
+ , subq_6.median_booking_value
+ , subq_6.booking_value_p99
+ , subq_6.discrete_booking_value_p99
+ , subq_6.approximate_continuous_booking_value_p99
+ , subq_6.approximate_discrete_booking_value_p99
+ FROM (
+ -- Read Elements From Semantic Model 'bookings_source'
+ SELECT
+ 1 AS bookings
+ , CASE WHEN is_instant THEN 1 ELSE 0 END AS instant_bookings
+ , bookings_source_src_28000.booking_value
+ , bookings_source_src_28000.booking_value AS max_booking_value
+ , bookings_source_src_28000.booking_value AS min_booking_value
+ , bookings_source_src_28000.guest_id AS bookers
+ , bookings_source_src_28000.booking_value AS average_booking_value
+ , bookings_source_src_28000.booking_value AS booking_payments
+ , CASE WHEN referrer_id IS NOT NULL THEN 1 ELSE 0 END AS referred_bookings
+ , bookings_source_src_28000.booking_value AS median_booking_value
+ , bookings_source_src_28000.booking_value AS booking_value_p99
+ , bookings_source_src_28000.booking_value AS discrete_booking_value_p99
+ , bookings_source_src_28000.booking_value AS approximate_continuous_booking_value_p99
+ , bookings_source_src_28000.booking_value AS approximate_discrete_booking_value_p99
+ , bookings_source_src_28000.is_instant
+ , DATE_TRUNC('day', bookings_source_src_28000.ds) AS ds__day
+ , DATE_TRUNC('week', bookings_source_src_28000.ds) AS ds__week
+ , DATE_TRUNC('month', bookings_source_src_28000.ds) AS ds__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.ds) AS ds__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.ds) AS ds__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds) AS ds__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds) AS ds__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds) AS ds__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds) AS ds__extract_day
+ , EXTRACT(DAYOFWEEK_ISO FROM bookings_source_src_28000.ds) AS ds__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.ds) AS ds__extract_doy
+ , DATE_TRUNC('day', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__day
+ , DATE_TRUNC('week', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__week
+ , DATE_TRUNC('month', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_day
+ , EXTRACT(DAYOFWEEK_ISO FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_doy
+ , DATE_TRUNC('day', bookings_source_src_28000.paid_at) AS paid_at__day
+ , DATE_TRUNC('week', bookings_source_src_28000.paid_at) AS paid_at__week
+ , DATE_TRUNC('month', bookings_source_src_28000.paid_at) AS paid_at__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.paid_at) AS paid_at__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.paid_at) AS paid_at__year
+ , EXTRACT(year FROM bookings_source_src_28000.paid_at) AS paid_at__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.paid_at) AS paid_at__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.paid_at) AS paid_at__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.paid_at) AS paid_at__extract_day
+ , EXTRACT(DAYOFWEEK_ISO FROM bookings_source_src_28000.paid_at) AS paid_at__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.paid_at) AS paid_at__extract_doy
+ , bookings_source_src_28000.is_instant AS booking__is_instant
+ , DATE_TRUNC('day', bookings_source_src_28000.ds) AS booking__ds__day
+ , DATE_TRUNC('week', bookings_source_src_28000.ds) AS booking__ds__week
+ , DATE_TRUNC('month', bookings_source_src_28000.ds) AS booking__ds__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.ds) AS booking__ds__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.ds) AS booking__ds__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds) AS booking__ds__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds) AS booking__ds__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds) AS booking__ds__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds) AS booking__ds__extract_day
+ , EXTRACT(DAYOFWEEK_ISO FROM bookings_source_src_28000.ds) AS booking__ds__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.ds) AS booking__ds__extract_doy
+ , DATE_TRUNC('day', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__day
+ , DATE_TRUNC('week', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__week
+ , DATE_TRUNC('month', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_day
+ , EXTRACT(DAYOFWEEK_ISO FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_doy
+ , DATE_TRUNC('day', bookings_source_src_28000.paid_at) AS booking__paid_at__day
+ , DATE_TRUNC('week', bookings_source_src_28000.paid_at) AS booking__paid_at__week
+ , DATE_TRUNC('month', bookings_source_src_28000.paid_at) AS booking__paid_at__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.paid_at) AS booking__paid_at__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.paid_at) AS booking__paid_at__year
+ , EXTRACT(year FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_day
+ , EXTRACT(DAYOFWEEK_ISO FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_doy
+ , bookings_source_src_28000.listing_id AS listing
+ , bookings_source_src_28000.guest_id AS guest
+ , bookings_source_src_28000.host_id AS host
+ , bookings_source_src_28000.listing_id AS booking__listing
+ , bookings_source_src_28000.guest_id AS booking__guest
+ , bookings_source_src_28000.host_id AS booking__host
+ FROM ***************************.fct_bookings bookings_source_src_28000
+ ) subq_6
+ ) subq_7
+ ) subq_8
+ GROUP BY
+ subq_8.booking__is_instant
+ ) subq_9
+ ) subq_10
+ ) subq_11
+ ON
+ subq_5.booking__is_instant = subq_11.booking__is_instant
+ GROUP BY
+ COALESCE(subq_5.booking__is_instant, subq_11.booking__is_instant)
+) subq_12
+LIMIT 1
diff --git a/tests_metricflow/snapshots/test_derived_metric_rendering.py/SqlQueryPlan/Databricks/test_derived_metric_that_defines_the_same_alias_in_different_components__plan0_optimized.sql b/tests_metricflow/snapshots/test_derived_metric_rendering.py/SqlQueryPlan/Databricks/test_derived_metric_that_defines_the_same_alias_in_different_components__plan0_optimized.sql
new file mode 100644
index 0000000000..6b1c46eee3
--- /dev/null
+++ b/tests_metricflow/snapshots/test_derived_metric_rendering.py/SqlQueryPlan/Databricks/test_derived_metric_that_defines_the_same_alias_in_different_components__plan0_optimized.sql
@@ -0,0 +1,59 @@
+-- Combine Aggregated Outputs
+-- Order By [] Limit 1
+SELECT
+ COALESCE(subq_18.booking__is_instant, subq_24.booking__is_instant) AS booking__is_instant
+ , MAX(subq_18.derived_shared_alias_1a) AS derived_shared_alias_1a
+ , MAX(subq_24.derived_shared_alias_2) AS derived_shared_alias_2
+FROM (
+ -- Compute Metrics via Expressions
+ SELECT
+ booking__is_instant
+ , shared_alias - 10 AS derived_shared_alias_1a
+ FROM (
+ -- Aggregate Measures
+ -- Compute Metrics via Expressions
+ SELECT
+ booking__is_instant
+ , SUM(bookings) AS shared_alias
+ FROM (
+ -- Read Elements From Semantic Model 'bookings_source'
+ -- Metric Time Dimension 'ds'
+ -- Pass Only Elements: ['bookings', 'booking__is_instant']
+ SELECT
+ is_instant AS booking__is_instant
+ , 1 AS bookings
+ FROM ***************************.fct_bookings bookings_source_src_28000
+ ) subq_15
+ GROUP BY
+ booking__is_instant
+ ) subq_17
+) subq_18
+FULL OUTER JOIN (
+ -- Compute Metrics via Expressions
+ SELECT
+ booking__is_instant
+ , shared_alias + 10 AS derived_shared_alias_2
+ FROM (
+ -- Aggregate Measures
+ -- Compute Metrics via Expressions
+ SELECT
+ booking__is_instant
+ , SUM(instant_bookings) AS shared_alias
+ FROM (
+ -- Read Elements From Semantic Model 'bookings_source'
+ -- Metric Time Dimension 'ds'
+ -- Pass Only Elements: ['instant_bookings', 'booking__is_instant']
+ SELECT
+ is_instant AS booking__is_instant
+ , CASE WHEN is_instant THEN 1 ELSE 0 END AS instant_bookings
+ FROM ***************************.fct_bookings bookings_source_src_28000
+ ) subq_21
+ GROUP BY
+ booking__is_instant
+ ) subq_23
+) subq_24
+ON
+ subq_18.booking__is_instant = subq_24.booking__is_instant
+GROUP BY
+ COALESCE(subq_18.booking__is_instant, subq_24.booking__is_instant)
+LIMIT 1
diff --git a/tests_metricflow/snapshots/test_derived_metric_rendering.py/SqlQueryPlan/DuckDB/test_derived_metric_that_defines_the_same_alias_in_different_components__plan0.sql b/tests_metricflow/snapshots/test_derived_metric_rendering.py/SqlQueryPlan/DuckDB/test_derived_metric_that_defines_the_same_alias_in_different_components__plan0.sql
new file mode 100644
index 0000000000..735273f62b
--- /dev/null
+++ b/tests_metricflow/snapshots/test_derived_metric_rendering.py/SqlQueryPlan/DuckDB/test_derived_metric_that_defines_the_same_alias_in_different_components__plan0.sql
@@ -0,0 +1,459 @@
+-- Order By [] Limit 1
+SELECT
+ subq_12.booking__is_instant
+ , subq_12.derived_shared_alias_1a
+ , subq_12.derived_shared_alias_2
+FROM (
+ -- Combine Aggregated Outputs
+ SELECT
+ COALESCE(subq_5.booking__is_instant, subq_11.booking__is_instant) AS booking__is_instant
+ , MAX(subq_5.derived_shared_alias_1a) AS derived_shared_alias_1a
+ , MAX(subq_11.derived_shared_alias_2) AS derived_shared_alias_2
+ FROM (
+ -- Compute Metrics via Expressions
+ SELECT
+ subq_4.booking__is_instant
+ , shared_alias - 10 AS derived_shared_alias_1a
+ FROM (
+ -- Compute Metrics via Expressions
+ SELECT
+ subq_3.booking__is_instant
+ , subq_3.bookings AS shared_alias
+ FROM (
+ -- Aggregate Measures
+ SELECT
+ subq_2.booking__is_instant
+ , SUM(subq_2.bookings) AS bookings
+ FROM (
+ -- Pass Only Elements: ['bookings', 'booking__is_instant']
+ SELECT
+ subq_1.booking__is_instant
+ , subq_1.bookings
+ FROM (
+ -- Metric Time Dimension 'ds'
+ SELECT
+ subq_0.ds__day
+ , subq_0.ds__week
+ , subq_0.ds__month
+ , subq_0.ds__quarter
+ , subq_0.ds__year
+ , subq_0.ds__extract_year
+ , subq_0.ds__extract_quarter
+ , subq_0.ds__extract_month
+ , subq_0.ds__extract_day
+ , subq_0.ds__extract_dow
+ , subq_0.ds__extract_doy
+ , subq_0.ds_partitioned__day
+ , subq_0.ds_partitioned__week
+ , subq_0.ds_partitioned__month
+ , subq_0.ds_partitioned__quarter
+ , subq_0.ds_partitioned__year
+ , subq_0.ds_partitioned__extract_year
+ , subq_0.ds_partitioned__extract_quarter
+ , subq_0.ds_partitioned__extract_month
+ , subq_0.ds_partitioned__extract_day
+ , subq_0.ds_partitioned__extract_dow
+ , subq_0.ds_partitioned__extract_doy
+ , subq_0.paid_at__day
+ , subq_0.paid_at__week
+ , subq_0.paid_at__month
+ , subq_0.paid_at__quarter
+ , subq_0.paid_at__year
+ , subq_0.paid_at__extract_year
+ , subq_0.paid_at__extract_quarter
+ , subq_0.paid_at__extract_month
+ , subq_0.paid_at__extract_day
+ , subq_0.paid_at__extract_dow
+ , subq_0.paid_at__extract_doy
+ , subq_0.booking__ds__day
+ , subq_0.booking__ds__week
+ , subq_0.booking__ds__month
+ , subq_0.booking__ds__quarter
+ , subq_0.booking__ds__year
+ , subq_0.booking__ds__extract_year
+ , subq_0.booking__ds__extract_quarter
+ , subq_0.booking__ds__extract_month
+ , subq_0.booking__ds__extract_day
+ , subq_0.booking__ds__extract_dow
+ , subq_0.booking__ds__extract_doy
+ , subq_0.booking__ds_partitioned__day
+ , subq_0.booking__ds_partitioned__week
+ , subq_0.booking__ds_partitioned__month
+ , subq_0.booking__ds_partitioned__quarter
+ , subq_0.booking__ds_partitioned__year
+ , subq_0.booking__ds_partitioned__extract_year
+ , subq_0.booking__ds_partitioned__extract_quarter
+ , subq_0.booking__ds_partitioned__extract_month
+ , subq_0.booking__ds_partitioned__extract_day
+ , subq_0.booking__ds_partitioned__extract_dow
+ , subq_0.booking__ds_partitioned__extract_doy
+ , subq_0.booking__paid_at__day
+ , subq_0.booking__paid_at__week
+ , subq_0.booking__paid_at__month
+ , subq_0.booking__paid_at__quarter
+ , subq_0.booking__paid_at__year
+ , subq_0.booking__paid_at__extract_year
+ , subq_0.booking__paid_at__extract_quarter
+ , subq_0.booking__paid_at__extract_month
+ , subq_0.booking__paid_at__extract_day
+ , subq_0.booking__paid_at__extract_dow
+ , subq_0.booking__paid_at__extract_doy
+ , subq_0.ds__day AS metric_time__day
+ , subq_0.ds__week AS metric_time__week
+ , subq_0.ds__month AS metric_time__month
+ , subq_0.ds__quarter AS metric_time__quarter
+ , subq_0.ds__year AS metric_time__year
+ , subq_0.ds__extract_year AS metric_time__extract_year
+ , subq_0.ds__extract_quarter AS metric_time__extract_quarter
+ , subq_0.ds__extract_month AS metric_time__extract_month
+ , subq_0.ds__extract_day AS metric_time__extract_day
+ , subq_0.ds__extract_dow AS metric_time__extract_dow
+ , subq_0.ds__extract_doy AS metric_time__extract_doy
+ , subq_0.listing
+ , subq_0.guest
+ , subq_0.host
+ , subq_0.booking__listing
+ , subq_0.booking__guest
+ , subq_0.booking__host
+ , subq_0.is_instant
+ , subq_0.booking__is_instant
+ , subq_0.bookings
+ , subq_0.instant_bookings
+ , subq_0.booking_value
+ , subq_0.max_booking_value
+ , subq_0.min_booking_value
+ , subq_0.bookers
+ , subq_0.average_booking_value
+ , subq_0.referred_bookings
+ , subq_0.median_booking_value
+ , subq_0.booking_value_p99
+ , subq_0.discrete_booking_value_p99
+ , subq_0.approximate_continuous_booking_value_p99
+ , subq_0.approximate_discrete_booking_value_p99
+ FROM (
+ -- Read Elements From Semantic Model 'bookings_source'
+ SELECT
+ 1 AS bookings
+ , CASE WHEN is_instant THEN 1 ELSE 0 END AS instant_bookings
+ , bookings_source_src_28000.booking_value
+ , bookings_source_src_28000.booking_value AS max_booking_value
+ , bookings_source_src_28000.booking_value AS min_booking_value
+ , bookings_source_src_28000.guest_id AS bookers
+ , bookings_source_src_28000.booking_value AS average_booking_value
+ , bookings_source_src_28000.booking_value AS booking_payments
+ , CASE WHEN referrer_id IS NOT NULL THEN 1 ELSE 0 END AS referred_bookings
+ , bookings_source_src_28000.booking_value AS median_booking_value
+ , bookings_source_src_28000.booking_value AS booking_value_p99
+ , bookings_source_src_28000.booking_value AS discrete_booking_value_p99
+ , bookings_source_src_28000.booking_value AS approximate_continuous_booking_value_p99
+ , bookings_source_src_28000.booking_value AS approximate_discrete_booking_value_p99
+ , bookings_source_src_28000.is_instant
+ , DATE_TRUNC('day', bookings_source_src_28000.ds) AS ds__day
+ , DATE_TRUNC('week', bookings_source_src_28000.ds) AS ds__week
+ , DATE_TRUNC('month', bookings_source_src_28000.ds) AS ds__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.ds) AS ds__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.ds) AS ds__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds) AS ds__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds) AS ds__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds) AS ds__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds) AS ds__extract_day
+ , EXTRACT(isodow FROM bookings_source_src_28000.ds) AS ds__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.ds) AS ds__extract_doy
+ , DATE_TRUNC('day', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__day
+ , DATE_TRUNC('week', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__week
+ , DATE_TRUNC('month', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_day
+ , EXTRACT(isodow FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_doy
+ , DATE_TRUNC('day', bookings_source_src_28000.paid_at) AS paid_at__day
+ , DATE_TRUNC('week', bookings_source_src_28000.paid_at) AS paid_at__week
+ , DATE_TRUNC('month', bookings_source_src_28000.paid_at) AS paid_at__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.paid_at) AS paid_at__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.paid_at) AS paid_at__year
+ , EXTRACT(year FROM bookings_source_src_28000.paid_at) AS paid_at__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.paid_at) AS paid_at__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.paid_at) AS paid_at__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.paid_at) AS paid_at__extract_day
+ , EXTRACT(isodow FROM bookings_source_src_28000.paid_at) AS paid_at__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.paid_at) AS paid_at__extract_doy
+ , bookings_source_src_28000.is_instant AS booking__is_instant
+ , DATE_TRUNC('day', bookings_source_src_28000.ds) AS booking__ds__day
+ , DATE_TRUNC('week', bookings_source_src_28000.ds) AS booking__ds__week
+ , DATE_TRUNC('month', bookings_source_src_28000.ds) AS booking__ds__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.ds) AS booking__ds__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.ds) AS booking__ds__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds) AS booking__ds__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds) AS booking__ds__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds) AS booking__ds__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds) AS booking__ds__extract_day
+ , EXTRACT(isodow FROM bookings_source_src_28000.ds) AS booking__ds__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.ds) AS booking__ds__extract_doy
+ , DATE_TRUNC('day', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__day
+ , DATE_TRUNC('week', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__week
+ , DATE_TRUNC('month', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_day
+ , EXTRACT(isodow FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_doy
+ , DATE_TRUNC('day', bookings_source_src_28000.paid_at) AS booking__paid_at__day
+ , DATE_TRUNC('week', bookings_source_src_28000.paid_at) AS booking__paid_at__week
+ , DATE_TRUNC('month', bookings_source_src_28000.paid_at) AS booking__paid_at__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.paid_at) AS booking__paid_at__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.paid_at) AS booking__paid_at__year
+ , EXTRACT(year FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_day
+ , EXTRACT(isodow FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_doy
+ , bookings_source_src_28000.listing_id AS listing
+ , bookings_source_src_28000.guest_id AS guest
+ , bookings_source_src_28000.host_id AS host
+ , bookings_source_src_28000.listing_id AS booking__listing
+ , bookings_source_src_28000.guest_id AS booking__guest
+ , bookings_source_src_28000.host_id AS booking__host
+ FROM ***************************.fct_bookings bookings_source_src_28000
+ ) subq_0
+ ) subq_1
+ ) subq_2
+ GROUP BY
+ subq_2.booking__is_instant
+ ) subq_3
+ ) subq_4
+ ) subq_5
+ FULL OUTER JOIN (
+ -- Compute Metrics via Expressions
+ SELECT
+ subq_10.booking__is_instant
+ , shared_alias + 10 AS derived_shared_alias_2
+ FROM (
+ -- Compute Metrics via Expressions
+ SELECT
+ subq_9.booking__is_instant
+ , subq_9.instant_bookings AS shared_alias
+ FROM (
+ -- Aggregate Measures
+ SELECT
+ subq_8.booking__is_instant
+ , SUM(subq_8.instant_bookings) AS instant_bookings
+ FROM (
+ -- Pass Only Elements: ['instant_bookings', 'booking__is_instant']
+ SELECT
+ subq_7.booking__is_instant
+ , subq_7.instant_bookings
+ FROM (
+ -- Metric Time Dimension 'ds'
+ SELECT
+ subq_6.ds__day
+ , subq_6.ds__week
+ , subq_6.ds__month
+ , subq_6.ds__quarter
+ , subq_6.ds__year
+ , subq_6.ds__extract_year
+ , subq_6.ds__extract_quarter
+ , subq_6.ds__extract_month
+ , subq_6.ds__extract_day
+ , subq_6.ds__extract_dow
+ , subq_6.ds__extract_doy
+ , subq_6.ds_partitioned__day
+ , subq_6.ds_partitioned__week
+ , subq_6.ds_partitioned__month
+ , subq_6.ds_partitioned__quarter
+ , subq_6.ds_partitioned__year
+ , subq_6.ds_partitioned__extract_year
+ , subq_6.ds_partitioned__extract_quarter
+ , subq_6.ds_partitioned__extract_month
+ , subq_6.ds_partitioned__extract_day
+ , subq_6.ds_partitioned__extract_dow
+ , subq_6.ds_partitioned__extract_doy
+ , subq_6.paid_at__day
+ , subq_6.paid_at__week
+ , subq_6.paid_at__month
+ , subq_6.paid_at__quarter
+ , subq_6.paid_at__year
+ , subq_6.paid_at__extract_year
+ , subq_6.paid_at__extract_quarter
+ , subq_6.paid_at__extract_month
+ , subq_6.paid_at__extract_day
+ , subq_6.paid_at__extract_dow
+ , subq_6.paid_at__extract_doy
+ , subq_6.booking__ds__day
+ , subq_6.booking__ds__week
+ , subq_6.booking__ds__month
+ , subq_6.booking__ds__quarter
+ , subq_6.booking__ds__year
+ , subq_6.booking__ds__extract_year
+ , subq_6.booking__ds__extract_quarter
+ , subq_6.booking__ds__extract_month
+ , subq_6.booking__ds__extract_day
+ , subq_6.booking__ds__extract_dow
+ , subq_6.booking__ds__extract_doy
+ , subq_6.booking__ds_partitioned__day
+ , subq_6.booking__ds_partitioned__week
+ , subq_6.booking__ds_partitioned__month
+ , subq_6.booking__ds_partitioned__quarter
+ , subq_6.booking__ds_partitioned__year
+ , subq_6.booking__ds_partitioned__extract_year
+ , subq_6.booking__ds_partitioned__extract_quarter
+ , subq_6.booking__ds_partitioned__extract_month
+ , subq_6.booking__ds_partitioned__extract_day
+ , subq_6.booking__ds_partitioned__extract_dow
+ , subq_6.booking__ds_partitioned__extract_doy
+ , subq_6.booking__paid_at__day
+ , subq_6.booking__paid_at__week
+ , subq_6.booking__paid_at__month
+ , subq_6.booking__paid_at__quarter
+ , subq_6.booking__paid_at__year
+ , subq_6.booking__paid_at__extract_year
+ , subq_6.booking__paid_at__extract_quarter
+ , subq_6.booking__paid_at__extract_month
+ , subq_6.booking__paid_at__extract_day
+ , subq_6.booking__paid_at__extract_dow
+ , subq_6.booking__paid_at__extract_doy
+ , subq_6.ds__day AS metric_time__day
+ , subq_6.ds__week AS metric_time__week
+ , subq_6.ds__month AS metric_time__month
+ , subq_6.ds__quarter AS metric_time__quarter
+ , subq_6.ds__year AS metric_time__year
+ , subq_6.ds__extract_year AS metric_time__extract_year
+ , subq_6.ds__extract_quarter AS metric_time__extract_quarter
+ , subq_6.ds__extract_month AS metric_time__extract_month
+ , subq_6.ds__extract_day AS metric_time__extract_day
+ , subq_6.ds__extract_dow AS metric_time__extract_dow
+ , subq_6.ds__extract_doy AS metric_time__extract_doy
+ , subq_6.listing
+ , subq_6.guest
+ , subq_6.host
+ , subq_6.booking__listing
+ , subq_6.booking__guest
+ , subq_6.booking__host
+ , subq_6.is_instant
+ , subq_6.booking__is_instant
+ , subq_6.bookings
+ , subq_6.instant_bookings
+ , subq_6.booking_value
+ , subq_6.max_booking_value
+ , subq_6.min_booking_value
+ , subq_6.bookers
+ , subq_6.average_booking_value
+ , subq_6.referred_bookings
+ , subq_6.median_booking_value
+ , subq_6.booking_value_p99
+ , subq_6.discrete_booking_value_p99
+ , subq_6.approximate_continuous_booking_value_p99
+ , subq_6.approximate_discrete_booking_value_p99
+ FROM (
+ -- Read Elements From Semantic Model 'bookings_source'
+ SELECT
+ 1 AS bookings
+ , CASE WHEN is_instant THEN 1 ELSE 0 END AS instant_bookings
+ , bookings_source_src_28000.booking_value
+ , bookings_source_src_28000.booking_value AS max_booking_value
+ , bookings_source_src_28000.booking_value AS min_booking_value
+ , bookings_source_src_28000.guest_id AS bookers
+ , bookings_source_src_28000.booking_value AS average_booking_value
+ , bookings_source_src_28000.booking_value AS booking_payments
+ , CASE WHEN referrer_id IS NOT NULL THEN 1 ELSE 0 END AS referred_bookings
+ , bookings_source_src_28000.booking_value AS median_booking_value
+ , bookings_source_src_28000.booking_value AS booking_value_p99
+ , bookings_source_src_28000.booking_value AS discrete_booking_value_p99
+ , bookings_source_src_28000.booking_value AS approximate_continuous_booking_value_p99
+ , bookings_source_src_28000.booking_value AS approximate_discrete_booking_value_p99
+ , bookings_source_src_28000.is_instant
+ , DATE_TRUNC('day', bookings_source_src_28000.ds) AS ds__day
+ , DATE_TRUNC('week', bookings_source_src_28000.ds) AS ds__week
+ , DATE_TRUNC('month', bookings_source_src_28000.ds) AS ds__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.ds) AS ds__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.ds) AS ds__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds) AS ds__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds) AS ds__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds) AS ds__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds) AS ds__extract_day
+ , EXTRACT(isodow FROM bookings_source_src_28000.ds) AS ds__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.ds) AS ds__extract_doy
+ , DATE_TRUNC('day', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__day
+ , DATE_TRUNC('week', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__week
+ , DATE_TRUNC('month', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_day
+ , EXTRACT(isodow FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_doy
+ , DATE_TRUNC('day', bookings_source_src_28000.paid_at) AS paid_at__day
+ , DATE_TRUNC('week', bookings_source_src_28000.paid_at) AS paid_at__week
+ , DATE_TRUNC('month', bookings_source_src_28000.paid_at) AS paid_at__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.paid_at) AS paid_at__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.paid_at) AS paid_at__year
+ , EXTRACT(year FROM bookings_source_src_28000.paid_at) AS paid_at__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.paid_at) AS paid_at__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.paid_at) AS paid_at__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.paid_at) AS paid_at__extract_day
+ , EXTRACT(isodow FROM bookings_source_src_28000.paid_at) AS paid_at__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.paid_at) AS paid_at__extract_doy
+ , bookings_source_src_28000.is_instant AS booking__is_instant
+ , DATE_TRUNC('day', bookings_source_src_28000.ds) AS booking__ds__day
+ , DATE_TRUNC('week', bookings_source_src_28000.ds) AS booking__ds__week
+ , DATE_TRUNC('month', bookings_source_src_28000.ds) AS booking__ds__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.ds) AS booking__ds__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.ds) AS booking__ds__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds) AS booking__ds__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds) AS booking__ds__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds) AS booking__ds__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds) AS booking__ds__extract_day
+ , EXTRACT(isodow FROM bookings_source_src_28000.ds) AS booking__ds__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.ds) AS booking__ds__extract_doy
+ , DATE_TRUNC('day', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__day
+ , DATE_TRUNC('week', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__week
+ , DATE_TRUNC('month', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_day
+ , EXTRACT(isodow FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_doy
+ , DATE_TRUNC('day', bookings_source_src_28000.paid_at) AS booking__paid_at__day
+ , DATE_TRUNC('week', bookings_source_src_28000.paid_at) AS booking__paid_at__week
+ , DATE_TRUNC('month', bookings_source_src_28000.paid_at) AS booking__paid_at__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.paid_at) AS booking__paid_at__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.paid_at) AS booking__paid_at__year
+ , EXTRACT(year FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_day
+ , EXTRACT(isodow FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_doy
+ , bookings_source_src_28000.listing_id AS listing
+ , bookings_source_src_28000.guest_id AS guest
+ , bookings_source_src_28000.host_id AS host
+ , bookings_source_src_28000.listing_id AS booking__listing
+ , bookings_source_src_28000.guest_id AS booking__guest
+ , bookings_source_src_28000.host_id AS booking__host
+ FROM ***************************.fct_bookings bookings_source_src_28000
+ ) subq_6
+ ) subq_7
+ ) subq_8
+ GROUP BY
+ subq_8.booking__is_instant
+ ) subq_9
+ ) subq_10
+ ) subq_11
+ ON
+ subq_5.booking__is_instant = subq_11.booking__is_instant
+ GROUP BY
+ COALESCE(subq_5.booking__is_instant, subq_11.booking__is_instant)
+) subq_12
+LIMIT 1
diff --git a/tests_metricflow/snapshots/test_derived_metric_rendering.py/SqlQueryPlan/DuckDB/test_derived_metric_that_defines_the_same_alias_in_different_components__plan0_optimized.sql b/tests_metricflow/snapshots/test_derived_metric_rendering.py/SqlQueryPlan/DuckDB/test_derived_metric_that_defines_the_same_alias_in_different_components__plan0_optimized.sql
new file mode 100644
index 0000000000..6b1c46eee3
--- /dev/null
+++ b/tests_metricflow/snapshots/test_derived_metric_rendering.py/SqlQueryPlan/DuckDB/test_derived_metric_that_defines_the_same_alias_in_different_components__plan0_optimized.sql
@@ -0,0 +1,59 @@
+-- Combine Aggregated Outputs
+-- Order By [] Limit 1
+SELECT
+ COALESCE(subq_18.booking__is_instant, subq_24.booking__is_instant) AS booking__is_instant
+ , MAX(subq_18.derived_shared_alias_1a) AS derived_shared_alias_1a
+ , MAX(subq_24.derived_shared_alias_2) AS derived_shared_alias_2
+FROM (
+ -- Compute Metrics via Expressions
+ SELECT
+ booking__is_instant
+ , shared_alias - 10 AS derived_shared_alias_1a
+ FROM (
+ -- Aggregate Measures
+ -- Compute Metrics via Expressions
+ SELECT
+ booking__is_instant
+ , SUM(bookings) AS shared_alias
+ FROM (
+ -- Read Elements From Semantic Model 'bookings_source'
+ -- Metric Time Dimension 'ds'
+ -- Pass Only Elements: ['bookings', 'booking__is_instant']
+ SELECT
+ is_instant AS booking__is_instant
+ , 1 AS bookings
+ FROM ***************************.fct_bookings bookings_source_src_28000
+ ) subq_15
+ GROUP BY
+ booking__is_instant
+ ) subq_17
+) subq_18
+FULL OUTER JOIN (
+ -- Compute Metrics via Expressions
+ SELECT
+ booking__is_instant
+ , shared_alias + 10 AS derived_shared_alias_2
+ FROM (
+ -- Aggregate Measures
+ -- Compute Metrics via Expressions
+ SELECT
+ booking__is_instant
+ , SUM(instant_bookings) AS shared_alias
+ FROM (
+ -- Read Elements From Semantic Model 'bookings_source'
+ -- Metric Time Dimension 'ds'
+ -- Pass Only Elements: ['instant_bookings', 'booking__is_instant']
+ SELECT
+ is_instant AS booking__is_instant
+ , CASE WHEN is_instant THEN 1 ELSE 0 END AS instant_bookings
+ FROM ***************************.fct_bookings bookings_source_src_28000
+ ) subq_21
+ GROUP BY
+ booking__is_instant
+ ) subq_23
+) subq_24
+ON
+ subq_18.booking__is_instant = subq_24.booking__is_instant
+GROUP BY
+ COALESCE(subq_18.booking__is_instant, subq_24.booking__is_instant)
+LIMIT 1
diff --git a/tests_metricflow/snapshots/test_derived_metric_rendering.py/SqlQueryPlan/Postgres/test_derived_metric_that_defines_the_same_alias_in_different_components__plan0.sql b/tests_metricflow/snapshots/test_derived_metric_rendering.py/SqlQueryPlan/Postgres/test_derived_metric_that_defines_the_same_alias_in_different_components__plan0.sql
new file mode 100644
index 0000000000..735273f62b
--- /dev/null
+++ b/tests_metricflow/snapshots/test_derived_metric_rendering.py/SqlQueryPlan/Postgres/test_derived_metric_that_defines_the_same_alias_in_different_components__plan0.sql
@@ -0,0 +1,459 @@
+-- Order By [] Limit 1
+SELECT
+ subq_12.booking__is_instant
+ , subq_12.derived_shared_alias_1a
+ , subq_12.derived_shared_alias_2
+FROM (
+ -- Combine Aggregated Outputs
+ SELECT
+ COALESCE(subq_5.booking__is_instant, subq_11.booking__is_instant) AS booking__is_instant
+ , MAX(subq_5.derived_shared_alias_1a) AS derived_shared_alias_1a
+ , MAX(subq_11.derived_shared_alias_2) AS derived_shared_alias_2
+ FROM (
+ -- Compute Metrics via Expressions
+ SELECT
+ subq_4.booking__is_instant
+ , shared_alias - 10 AS derived_shared_alias_1a
+ FROM (
+ -- Compute Metrics via Expressions
+ SELECT
+ subq_3.booking__is_instant
+ , subq_3.bookings AS shared_alias
+ FROM (
+ -- Aggregate Measures
+ SELECT
+ subq_2.booking__is_instant
+ , SUM(subq_2.bookings) AS bookings
+ FROM (
+ -- Pass Only Elements: ['bookings', 'booking__is_instant']
+ SELECT
+ subq_1.booking__is_instant
+ , subq_1.bookings
+ FROM (
+ -- Metric Time Dimension 'ds'
+ SELECT
+ subq_0.ds__day
+ , subq_0.ds__week
+ , subq_0.ds__month
+ , subq_0.ds__quarter
+ , subq_0.ds__year
+ , subq_0.ds__extract_year
+ , subq_0.ds__extract_quarter
+ , subq_0.ds__extract_month
+ , subq_0.ds__extract_day
+ , subq_0.ds__extract_dow
+ , subq_0.ds__extract_doy
+ , subq_0.ds_partitioned__day
+ , subq_0.ds_partitioned__week
+ , subq_0.ds_partitioned__month
+ , subq_0.ds_partitioned__quarter
+ , subq_0.ds_partitioned__year
+ , subq_0.ds_partitioned__extract_year
+ , subq_0.ds_partitioned__extract_quarter
+ , subq_0.ds_partitioned__extract_month
+ , subq_0.ds_partitioned__extract_day
+ , subq_0.ds_partitioned__extract_dow
+ , subq_0.ds_partitioned__extract_doy
+ , subq_0.paid_at__day
+ , subq_0.paid_at__week
+ , subq_0.paid_at__month
+ , subq_0.paid_at__quarter
+ , subq_0.paid_at__year
+ , subq_0.paid_at__extract_year
+ , subq_0.paid_at__extract_quarter
+ , subq_0.paid_at__extract_month
+ , subq_0.paid_at__extract_day
+ , subq_0.paid_at__extract_dow
+ , subq_0.paid_at__extract_doy
+ , subq_0.booking__ds__day
+ , subq_0.booking__ds__week
+ , subq_0.booking__ds__month
+ , subq_0.booking__ds__quarter
+ , subq_0.booking__ds__year
+ , subq_0.booking__ds__extract_year
+ , subq_0.booking__ds__extract_quarter
+ , subq_0.booking__ds__extract_month
+ , subq_0.booking__ds__extract_day
+ , subq_0.booking__ds__extract_dow
+ , subq_0.booking__ds__extract_doy
+ , subq_0.booking__ds_partitioned__day
+ , subq_0.booking__ds_partitioned__week
+ , subq_0.booking__ds_partitioned__month
+ , subq_0.booking__ds_partitioned__quarter
+ , subq_0.booking__ds_partitioned__year
+ , subq_0.booking__ds_partitioned__extract_year
+ , subq_0.booking__ds_partitioned__extract_quarter
+ , subq_0.booking__ds_partitioned__extract_month
+ , subq_0.booking__ds_partitioned__extract_day
+ , subq_0.booking__ds_partitioned__extract_dow
+ , subq_0.booking__ds_partitioned__extract_doy
+ , subq_0.booking__paid_at__day
+ , subq_0.booking__paid_at__week
+ , subq_0.booking__paid_at__month
+ , subq_0.booking__paid_at__quarter
+ , subq_0.booking__paid_at__year
+ , subq_0.booking__paid_at__extract_year
+ , subq_0.booking__paid_at__extract_quarter
+ , subq_0.booking__paid_at__extract_month
+ , subq_0.booking__paid_at__extract_day
+ , subq_0.booking__paid_at__extract_dow
+ , subq_0.booking__paid_at__extract_doy
+ , subq_0.ds__day AS metric_time__day
+ , subq_0.ds__week AS metric_time__week
+ , subq_0.ds__month AS metric_time__month
+ , subq_0.ds__quarter AS metric_time__quarter
+ , subq_0.ds__year AS metric_time__year
+ , subq_0.ds__extract_year AS metric_time__extract_year
+ , subq_0.ds__extract_quarter AS metric_time__extract_quarter
+ , subq_0.ds__extract_month AS metric_time__extract_month
+ , subq_0.ds__extract_day AS metric_time__extract_day
+ , subq_0.ds__extract_dow AS metric_time__extract_dow
+ , subq_0.ds__extract_doy AS metric_time__extract_doy
+ , subq_0.listing
+ , subq_0.guest
+ , subq_0.host
+ , subq_0.booking__listing
+ , subq_0.booking__guest
+ , subq_0.booking__host
+ , subq_0.is_instant
+ , subq_0.booking__is_instant
+ , subq_0.bookings
+ , subq_0.instant_bookings
+ , subq_0.booking_value
+ , subq_0.max_booking_value
+ , subq_0.min_booking_value
+ , subq_0.bookers
+ , subq_0.average_booking_value
+ , subq_0.referred_bookings
+ , subq_0.median_booking_value
+ , subq_0.booking_value_p99
+ , subq_0.discrete_booking_value_p99
+ , subq_0.approximate_continuous_booking_value_p99
+ , subq_0.approximate_discrete_booking_value_p99
+ FROM (
+ -- Read Elements From Semantic Model 'bookings_source'
+ SELECT
+ 1 AS bookings
+ , CASE WHEN is_instant THEN 1 ELSE 0 END AS instant_bookings
+ , bookings_source_src_28000.booking_value
+ , bookings_source_src_28000.booking_value AS max_booking_value
+ , bookings_source_src_28000.booking_value AS min_booking_value
+ , bookings_source_src_28000.guest_id AS bookers
+ , bookings_source_src_28000.booking_value AS average_booking_value
+ , bookings_source_src_28000.booking_value AS booking_payments
+ , CASE WHEN referrer_id IS NOT NULL THEN 1 ELSE 0 END AS referred_bookings
+ , bookings_source_src_28000.booking_value AS median_booking_value
+ , bookings_source_src_28000.booking_value AS booking_value_p99
+ , bookings_source_src_28000.booking_value AS discrete_booking_value_p99
+ , bookings_source_src_28000.booking_value AS approximate_continuous_booking_value_p99
+ , bookings_source_src_28000.booking_value AS approximate_discrete_booking_value_p99
+ , bookings_source_src_28000.is_instant
+ , DATE_TRUNC('day', bookings_source_src_28000.ds) AS ds__day
+ , DATE_TRUNC('week', bookings_source_src_28000.ds) AS ds__week
+ , DATE_TRUNC('month', bookings_source_src_28000.ds) AS ds__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.ds) AS ds__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.ds) AS ds__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds) AS ds__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds) AS ds__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds) AS ds__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds) AS ds__extract_day
+ , EXTRACT(isodow FROM bookings_source_src_28000.ds) AS ds__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.ds) AS ds__extract_doy
+ , DATE_TRUNC('day', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__day
+ , DATE_TRUNC('week', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__week
+ , DATE_TRUNC('month', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_day
+ , EXTRACT(isodow FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_doy
+ , DATE_TRUNC('day', bookings_source_src_28000.paid_at) AS paid_at__day
+ , DATE_TRUNC('week', bookings_source_src_28000.paid_at) AS paid_at__week
+ , DATE_TRUNC('month', bookings_source_src_28000.paid_at) AS paid_at__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.paid_at) AS paid_at__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.paid_at) AS paid_at__year
+ , EXTRACT(year FROM bookings_source_src_28000.paid_at) AS paid_at__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.paid_at) AS paid_at__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.paid_at) AS paid_at__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.paid_at) AS paid_at__extract_day
+ , EXTRACT(isodow FROM bookings_source_src_28000.paid_at) AS paid_at__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.paid_at) AS paid_at__extract_doy
+ , bookings_source_src_28000.is_instant AS booking__is_instant
+ , DATE_TRUNC('day', bookings_source_src_28000.ds) AS booking__ds__day
+ , DATE_TRUNC('week', bookings_source_src_28000.ds) AS booking__ds__week
+ , DATE_TRUNC('month', bookings_source_src_28000.ds) AS booking__ds__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.ds) AS booking__ds__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.ds) AS booking__ds__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds) AS booking__ds__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds) AS booking__ds__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds) AS booking__ds__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds) AS booking__ds__extract_day
+ , EXTRACT(isodow FROM bookings_source_src_28000.ds) AS booking__ds__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.ds) AS booking__ds__extract_doy
+ , DATE_TRUNC('day', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__day
+ , DATE_TRUNC('week', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__week
+ , DATE_TRUNC('month', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_day
+ , EXTRACT(isodow FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_doy
+ , DATE_TRUNC('day', bookings_source_src_28000.paid_at) AS booking__paid_at__day
+ , DATE_TRUNC('week', bookings_source_src_28000.paid_at) AS booking__paid_at__week
+ , DATE_TRUNC('month', bookings_source_src_28000.paid_at) AS booking__paid_at__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.paid_at) AS booking__paid_at__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.paid_at) AS booking__paid_at__year
+ , EXTRACT(year FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_day
+ , EXTRACT(isodow FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_doy
+ , bookings_source_src_28000.listing_id AS listing
+ , bookings_source_src_28000.guest_id AS guest
+ , bookings_source_src_28000.host_id AS host
+ , bookings_source_src_28000.listing_id AS booking__listing
+ , bookings_source_src_28000.guest_id AS booking__guest
+ , bookings_source_src_28000.host_id AS booking__host
+ FROM ***************************.fct_bookings bookings_source_src_28000
+ ) subq_0
+ ) subq_1
+ ) subq_2
+ GROUP BY
+ subq_2.booking__is_instant
+ ) subq_3
+ ) subq_4
+ ) subq_5
+ FULL OUTER JOIN (
+ -- Compute Metrics via Expressions
+ SELECT
+ subq_10.booking__is_instant
+ , shared_alias + 10 AS derived_shared_alias_2
+ FROM (
+ -- Compute Metrics via Expressions
+ SELECT
+ subq_9.booking__is_instant
+ , subq_9.instant_bookings AS shared_alias
+ FROM (
+ -- Aggregate Measures
+ SELECT
+ subq_8.booking__is_instant
+ , SUM(subq_8.instant_bookings) AS instant_bookings
+ FROM (
+ -- Pass Only Elements: ['instant_bookings', 'booking__is_instant']
+ SELECT
+ subq_7.booking__is_instant
+ , subq_7.instant_bookings
+ FROM (
+ -- Metric Time Dimension 'ds'
+ SELECT
+ subq_6.ds__day
+ , subq_6.ds__week
+ , subq_6.ds__month
+ , subq_6.ds__quarter
+ , subq_6.ds__year
+ , subq_6.ds__extract_year
+ , subq_6.ds__extract_quarter
+ , subq_6.ds__extract_month
+ , subq_6.ds__extract_day
+ , subq_6.ds__extract_dow
+ , subq_6.ds__extract_doy
+ , subq_6.ds_partitioned__day
+ , subq_6.ds_partitioned__week
+ , subq_6.ds_partitioned__month
+ , subq_6.ds_partitioned__quarter
+ , subq_6.ds_partitioned__year
+ , subq_6.ds_partitioned__extract_year
+ , subq_6.ds_partitioned__extract_quarter
+ , subq_6.ds_partitioned__extract_month
+ , subq_6.ds_partitioned__extract_day
+ , subq_6.ds_partitioned__extract_dow
+ , subq_6.ds_partitioned__extract_doy
+ , subq_6.paid_at__day
+ , subq_6.paid_at__week
+ , subq_6.paid_at__month
+ , subq_6.paid_at__quarter
+ , subq_6.paid_at__year
+ , subq_6.paid_at__extract_year
+ , subq_6.paid_at__extract_quarter
+ , subq_6.paid_at__extract_month
+ , subq_6.paid_at__extract_day
+ , subq_6.paid_at__extract_dow
+ , subq_6.paid_at__extract_doy
+ , subq_6.booking__ds__day
+ , subq_6.booking__ds__week
+ , subq_6.booking__ds__month
+ , subq_6.booking__ds__quarter
+ , subq_6.booking__ds__year
+ , subq_6.booking__ds__extract_year
+ , subq_6.booking__ds__extract_quarter
+ , subq_6.booking__ds__extract_month
+ , subq_6.booking__ds__extract_day
+ , subq_6.booking__ds__extract_dow
+ , subq_6.booking__ds__extract_doy
+ , subq_6.booking__ds_partitioned__day
+ , subq_6.booking__ds_partitioned__week
+ , subq_6.booking__ds_partitioned__month
+ , subq_6.booking__ds_partitioned__quarter
+ , subq_6.booking__ds_partitioned__year
+ , subq_6.booking__ds_partitioned__extract_year
+ , subq_6.booking__ds_partitioned__extract_quarter
+ , subq_6.booking__ds_partitioned__extract_month
+ , subq_6.booking__ds_partitioned__extract_day
+ , subq_6.booking__ds_partitioned__extract_dow
+ , subq_6.booking__ds_partitioned__extract_doy
+ , subq_6.booking__paid_at__day
+ , subq_6.booking__paid_at__week
+ , subq_6.booking__paid_at__month
+ , subq_6.booking__paid_at__quarter
+ , subq_6.booking__paid_at__year
+ , subq_6.booking__paid_at__extract_year
+ , subq_6.booking__paid_at__extract_quarter
+ , subq_6.booking__paid_at__extract_month
+ , subq_6.booking__paid_at__extract_day
+ , subq_6.booking__paid_at__extract_dow
+ , subq_6.booking__paid_at__extract_doy
+ , subq_6.ds__day AS metric_time__day
+ , subq_6.ds__week AS metric_time__week
+ , subq_6.ds__month AS metric_time__month
+ , subq_6.ds__quarter AS metric_time__quarter
+ , subq_6.ds__year AS metric_time__year
+ , subq_6.ds__extract_year AS metric_time__extract_year
+ , subq_6.ds__extract_quarter AS metric_time__extract_quarter
+ , subq_6.ds__extract_month AS metric_time__extract_month
+ , subq_6.ds__extract_day AS metric_time__extract_day
+ , subq_6.ds__extract_dow AS metric_time__extract_dow
+ , subq_6.ds__extract_doy AS metric_time__extract_doy
+ , subq_6.listing
+ , subq_6.guest
+ , subq_6.host
+ , subq_6.booking__listing
+ , subq_6.booking__guest
+ , subq_6.booking__host
+ , subq_6.is_instant
+ , subq_6.booking__is_instant
+ , subq_6.bookings
+ , subq_6.instant_bookings
+ , subq_6.booking_value
+ , subq_6.max_booking_value
+ , subq_6.min_booking_value
+ , subq_6.bookers
+ , subq_6.average_booking_value
+ , subq_6.referred_bookings
+ , subq_6.median_booking_value
+ , subq_6.booking_value_p99
+ , subq_6.discrete_booking_value_p99
+ , subq_6.approximate_continuous_booking_value_p99
+ , subq_6.approximate_discrete_booking_value_p99
+ FROM (
+ -- Read Elements From Semantic Model 'bookings_source'
+ SELECT
+ 1 AS bookings
+ , CASE WHEN is_instant THEN 1 ELSE 0 END AS instant_bookings
+ , bookings_source_src_28000.booking_value
+ , bookings_source_src_28000.booking_value AS max_booking_value
+ , bookings_source_src_28000.booking_value AS min_booking_value
+ , bookings_source_src_28000.guest_id AS bookers
+ , bookings_source_src_28000.booking_value AS average_booking_value
+ , bookings_source_src_28000.booking_value AS booking_payments
+ , CASE WHEN referrer_id IS NOT NULL THEN 1 ELSE 0 END AS referred_bookings
+ , bookings_source_src_28000.booking_value AS median_booking_value
+ , bookings_source_src_28000.booking_value AS booking_value_p99
+ , bookings_source_src_28000.booking_value AS discrete_booking_value_p99
+ , bookings_source_src_28000.booking_value AS approximate_continuous_booking_value_p99
+ , bookings_source_src_28000.booking_value AS approximate_discrete_booking_value_p99
+ , bookings_source_src_28000.is_instant
+ , DATE_TRUNC('day', bookings_source_src_28000.ds) AS ds__day
+ , DATE_TRUNC('week', bookings_source_src_28000.ds) AS ds__week
+ , DATE_TRUNC('month', bookings_source_src_28000.ds) AS ds__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.ds) AS ds__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.ds) AS ds__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds) AS ds__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds) AS ds__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds) AS ds__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds) AS ds__extract_day
+ , EXTRACT(isodow FROM bookings_source_src_28000.ds) AS ds__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.ds) AS ds__extract_doy
+ , DATE_TRUNC('day', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__day
+ , DATE_TRUNC('week', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__week
+ , DATE_TRUNC('month', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_day
+ , EXTRACT(isodow FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_doy
+ , DATE_TRUNC('day', bookings_source_src_28000.paid_at) AS paid_at__day
+ , DATE_TRUNC('week', bookings_source_src_28000.paid_at) AS paid_at__week
+ , DATE_TRUNC('month', bookings_source_src_28000.paid_at) AS paid_at__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.paid_at) AS paid_at__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.paid_at) AS paid_at__year
+ , EXTRACT(year FROM bookings_source_src_28000.paid_at) AS paid_at__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.paid_at) AS paid_at__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.paid_at) AS paid_at__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.paid_at) AS paid_at__extract_day
+ , EXTRACT(isodow FROM bookings_source_src_28000.paid_at) AS paid_at__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.paid_at) AS paid_at__extract_doy
+ , bookings_source_src_28000.is_instant AS booking__is_instant
+ , DATE_TRUNC('day', bookings_source_src_28000.ds) AS booking__ds__day
+ , DATE_TRUNC('week', bookings_source_src_28000.ds) AS booking__ds__week
+ , DATE_TRUNC('month', bookings_source_src_28000.ds) AS booking__ds__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.ds) AS booking__ds__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.ds) AS booking__ds__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds) AS booking__ds__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds) AS booking__ds__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds) AS booking__ds__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds) AS booking__ds__extract_day
+ , EXTRACT(isodow FROM bookings_source_src_28000.ds) AS booking__ds__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.ds) AS booking__ds__extract_doy
+ , DATE_TRUNC('day', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__day
+ , DATE_TRUNC('week', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__week
+ , DATE_TRUNC('month', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_day
+ , EXTRACT(isodow FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_doy
+ , DATE_TRUNC('day', bookings_source_src_28000.paid_at) AS booking__paid_at__day
+ , DATE_TRUNC('week', bookings_source_src_28000.paid_at) AS booking__paid_at__week
+ , DATE_TRUNC('month', bookings_source_src_28000.paid_at) AS booking__paid_at__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.paid_at) AS booking__paid_at__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.paid_at) AS booking__paid_at__year
+ , EXTRACT(year FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_day
+ , EXTRACT(isodow FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_doy
+ , bookings_source_src_28000.listing_id AS listing
+ , bookings_source_src_28000.guest_id AS guest
+ , bookings_source_src_28000.host_id AS host
+ , bookings_source_src_28000.listing_id AS booking__listing
+ , bookings_source_src_28000.guest_id AS booking__guest
+ , bookings_source_src_28000.host_id AS booking__host
+ FROM ***************************.fct_bookings bookings_source_src_28000
+ ) subq_6
+ ) subq_7
+ ) subq_8
+ GROUP BY
+ subq_8.booking__is_instant
+ ) subq_9
+ ) subq_10
+ ) subq_11
+ ON
+ subq_5.booking__is_instant = subq_11.booking__is_instant
+ GROUP BY
+ COALESCE(subq_5.booking__is_instant, subq_11.booking__is_instant)
+) subq_12
+LIMIT 1
diff --git a/tests_metricflow/snapshots/test_derived_metric_rendering.py/SqlQueryPlan/Postgres/test_derived_metric_that_defines_the_same_alias_in_different_components__plan0_optimized.sql b/tests_metricflow/snapshots/test_derived_metric_rendering.py/SqlQueryPlan/Postgres/test_derived_metric_that_defines_the_same_alias_in_different_components__plan0_optimized.sql
new file mode 100644
index 0000000000..6b1c46eee3
--- /dev/null
+++ b/tests_metricflow/snapshots/test_derived_metric_rendering.py/SqlQueryPlan/Postgres/test_derived_metric_that_defines_the_same_alias_in_different_components__plan0_optimized.sql
@@ -0,0 +1,59 @@
+-- Combine Aggregated Outputs
+-- Order By [] Limit 1
+SELECT
+ COALESCE(subq_18.booking__is_instant, subq_24.booking__is_instant) AS booking__is_instant
+ , MAX(subq_18.derived_shared_alias_1a) AS derived_shared_alias_1a
+ , MAX(subq_24.derived_shared_alias_2) AS derived_shared_alias_2
+FROM (
+ -- Compute Metrics via Expressions
+ SELECT
+ booking__is_instant
+ , shared_alias - 10 AS derived_shared_alias_1a
+ FROM (
+ -- Aggregate Measures
+ -- Compute Metrics via Expressions
+ SELECT
+ booking__is_instant
+ , SUM(bookings) AS shared_alias
+ FROM (
+ -- Read Elements From Semantic Model 'bookings_source'
+ -- Metric Time Dimension 'ds'
+ -- Pass Only Elements: ['bookings', 'booking__is_instant']
+ SELECT
+ is_instant AS booking__is_instant
+ , 1 AS bookings
+ FROM ***************************.fct_bookings bookings_source_src_28000
+ ) subq_15
+ GROUP BY
+ booking__is_instant
+ ) subq_17
+) subq_18
+FULL OUTER JOIN (
+ -- Compute Metrics via Expressions
+ SELECT
+ booking__is_instant
+ , shared_alias + 10 AS derived_shared_alias_2
+ FROM (
+ -- Aggregate Measures
+ -- Compute Metrics via Expressions
+ SELECT
+ booking__is_instant
+ , SUM(instant_bookings) AS shared_alias
+ FROM (
+ -- Read Elements From Semantic Model 'bookings_source'
+ -- Metric Time Dimension 'ds'
+ -- Pass Only Elements: ['instant_bookings', 'booking__is_instant']
+ SELECT
+ is_instant AS booking__is_instant
+ , CASE WHEN is_instant THEN 1 ELSE 0 END AS instant_bookings
+ FROM ***************************.fct_bookings bookings_source_src_28000
+ ) subq_21
+ GROUP BY
+ booking__is_instant
+ ) subq_23
+) subq_24
+ON
+ subq_18.booking__is_instant = subq_24.booking__is_instant
+GROUP BY
+ COALESCE(subq_18.booking__is_instant, subq_24.booking__is_instant)
+LIMIT 1
diff --git a/tests_metricflow/snapshots/test_derived_metric_rendering.py/SqlQueryPlan/Redshift/test_derived_metric_that_defines_the_same_alias_in_different_components__plan0.sql b/tests_metricflow/snapshots/test_derived_metric_rendering.py/SqlQueryPlan/Redshift/test_derived_metric_that_defines_the_same_alias_in_different_components__plan0.sql
new file mode 100644
index 0000000000..48d371e340
--- /dev/null
+++ b/tests_metricflow/snapshots/test_derived_metric_rendering.py/SqlQueryPlan/Redshift/test_derived_metric_that_defines_the_same_alias_in_different_components__plan0.sql
@@ -0,0 +1,459 @@
+-- Order By [] Limit 1
+SELECT
+ subq_12.booking__is_instant
+ , subq_12.derived_shared_alias_1a
+ , subq_12.derived_shared_alias_2
+FROM (
+ -- Combine Aggregated Outputs
+ SELECT
+ COALESCE(subq_5.booking__is_instant, subq_11.booking__is_instant) AS booking__is_instant
+ , MAX(subq_5.derived_shared_alias_1a) AS derived_shared_alias_1a
+ , MAX(subq_11.derived_shared_alias_2) AS derived_shared_alias_2
+ FROM (
+ -- Compute Metrics via Expressions
+ SELECT
+ subq_4.booking__is_instant
+ , shared_alias - 10 AS derived_shared_alias_1a
+ FROM (
+ -- Compute Metrics via Expressions
+ SELECT
+ subq_3.booking__is_instant
+ , subq_3.bookings AS shared_alias
+ FROM (
+ -- Aggregate Measures
+ SELECT
+ subq_2.booking__is_instant
+ , SUM(subq_2.bookings) AS bookings
+ FROM (
+ -- Pass Only Elements: ['bookings', 'booking__is_instant']
+ SELECT
+ subq_1.booking__is_instant
+ , subq_1.bookings
+ FROM (
+ -- Metric Time Dimension 'ds'
+ SELECT
+ subq_0.ds__day
+ , subq_0.ds__week
+ , subq_0.ds__month
+ , subq_0.ds__quarter
+ , subq_0.ds__year
+ , subq_0.ds__extract_year
+ , subq_0.ds__extract_quarter
+ , subq_0.ds__extract_month
+ , subq_0.ds__extract_day
+ , subq_0.ds__extract_dow
+ , subq_0.ds__extract_doy
+ , subq_0.ds_partitioned__day
+ , subq_0.ds_partitioned__week
+ , subq_0.ds_partitioned__month
+ , subq_0.ds_partitioned__quarter
+ , subq_0.ds_partitioned__year
+ , subq_0.ds_partitioned__extract_year
+ , subq_0.ds_partitioned__extract_quarter
+ , subq_0.ds_partitioned__extract_month
+ , subq_0.ds_partitioned__extract_day
+ , subq_0.ds_partitioned__extract_dow
+ , subq_0.ds_partitioned__extract_doy
+ , subq_0.paid_at__day
+ , subq_0.paid_at__week
+ , subq_0.paid_at__month
+ , subq_0.paid_at__quarter
+ , subq_0.paid_at__year
+ , subq_0.paid_at__extract_year
+ , subq_0.paid_at__extract_quarter
+ , subq_0.paid_at__extract_month
+ , subq_0.paid_at__extract_day
+ , subq_0.paid_at__extract_dow
+ , subq_0.paid_at__extract_doy
+ , subq_0.booking__ds__day
+ , subq_0.booking__ds__week
+ , subq_0.booking__ds__month
+ , subq_0.booking__ds__quarter
+ , subq_0.booking__ds__year
+ , subq_0.booking__ds__extract_year
+ , subq_0.booking__ds__extract_quarter
+ , subq_0.booking__ds__extract_month
+ , subq_0.booking__ds__extract_day
+ , subq_0.booking__ds__extract_dow
+ , subq_0.booking__ds__extract_doy
+ , subq_0.booking__ds_partitioned__day
+ , subq_0.booking__ds_partitioned__week
+ , subq_0.booking__ds_partitioned__month
+ , subq_0.booking__ds_partitioned__quarter
+ , subq_0.booking__ds_partitioned__year
+ , subq_0.booking__ds_partitioned__extract_year
+ , subq_0.booking__ds_partitioned__extract_quarter
+ , subq_0.booking__ds_partitioned__extract_month
+ , subq_0.booking__ds_partitioned__extract_day
+ , subq_0.booking__ds_partitioned__extract_dow
+ , subq_0.booking__ds_partitioned__extract_doy
+ , subq_0.booking__paid_at__day
+ , subq_0.booking__paid_at__week
+ , subq_0.booking__paid_at__month
+ , subq_0.booking__paid_at__quarter
+ , subq_0.booking__paid_at__year
+ , subq_0.booking__paid_at__extract_year
+ , subq_0.booking__paid_at__extract_quarter
+ , subq_0.booking__paid_at__extract_month
+ , subq_0.booking__paid_at__extract_day
+ , subq_0.booking__paid_at__extract_dow
+ , subq_0.booking__paid_at__extract_doy
+ , subq_0.ds__day AS metric_time__day
+ , subq_0.ds__week AS metric_time__week
+ , subq_0.ds__month AS metric_time__month
+ , subq_0.ds__quarter AS metric_time__quarter
+ , subq_0.ds__year AS metric_time__year
+ , subq_0.ds__extract_year AS metric_time__extract_year
+ , subq_0.ds__extract_quarter AS metric_time__extract_quarter
+ , subq_0.ds__extract_month AS metric_time__extract_month
+ , subq_0.ds__extract_day AS metric_time__extract_day
+ , subq_0.ds__extract_dow AS metric_time__extract_dow
+ , subq_0.ds__extract_doy AS metric_time__extract_doy
+ , subq_0.listing
+ , subq_0.guest
+ , subq_0.host
+ , subq_0.booking__listing
+ , subq_0.booking__guest
+ , subq_0.booking__host
+ , subq_0.is_instant
+ , subq_0.booking__is_instant
+ , subq_0.bookings
+ , subq_0.instant_bookings
+ , subq_0.booking_value
+ , subq_0.max_booking_value
+ , subq_0.min_booking_value
+ , subq_0.bookers
+ , subq_0.average_booking_value
+ , subq_0.referred_bookings
+ , subq_0.median_booking_value
+ , subq_0.booking_value_p99
+ , subq_0.discrete_booking_value_p99
+ , subq_0.approximate_continuous_booking_value_p99
+ , subq_0.approximate_discrete_booking_value_p99
+ FROM (
+ -- Read Elements From Semantic Model 'bookings_source'
+ SELECT
+ 1 AS bookings
+ , CASE WHEN is_instant THEN 1 ELSE 0 END AS instant_bookings
+ , bookings_source_src_28000.booking_value
+ , bookings_source_src_28000.booking_value AS max_booking_value
+ , bookings_source_src_28000.booking_value AS min_booking_value
+ , bookings_source_src_28000.guest_id AS bookers
+ , bookings_source_src_28000.booking_value AS average_booking_value
+ , bookings_source_src_28000.booking_value AS booking_payments
+ , CASE WHEN referrer_id IS NOT NULL THEN 1 ELSE 0 END AS referred_bookings
+ , bookings_source_src_28000.booking_value AS median_booking_value
+ , bookings_source_src_28000.booking_value AS booking_value_p99
+ , bookings_source_src_28000.booking_value AS discrete_booking_value_p99
+ , bookings_source_src_28000.booking_value AS approximate_continuous_booking_value_p99
+ , bookings_source_src_28000.booking_value AS approximate_discrete_booking_value_p99
+ , bookings_source_src_28000.is_instant
+ , DATE_TRUNC('day', bookings_source_src_28000.ds) AS ds__day
+ , DATE_TRUNC('week', bookings_source_src_28000.ds) AS ds__week
+ , DATE_TRUNC('month', bookings_source_src_28000.ds) AS ds__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.ds) AS ds__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.ds) AS ds__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds) AS ds__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds) AS ds__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds) AS ds__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds) AS ds__extract_day
+ , CASE WHEN EXTRACT(dow FROM bookings_source_src_28000.ds) = 0 THEN EXTRACT(dow FROM bookings_source_src_28000.ds) + 7 ELSE EXTRACT(dow FROM bookings_source_src_28000.ds) END AS ds__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.ds) AS ds__extract_doy
+ , DATE_TRUNC('day', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__day
+ , DATE_TRUNC('week', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__week
+ , DATE_TRUNC('month', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_day
+ , CASE WHEN EXTRACT(dow FROM bookings_source_src_28000.ds_partitioned) = 0 THEN EXTRACT(dow FROM bookings_source_src_28000.ds_partitioned) + 7 ELSE EXTRACT(dow FROM bookings_source_src_28000.ds_partitioned) END AS ds_partitioned__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_doy
+ , DATE_TRUNC('day', bookings_source_src_28000.paid_at) AS paid_at__day
+ , DATE_TRUNC('week', bookings_source_src_28000.paid_at) AS paid_at__week
+ , DATE_TRUNC('month', bookings_source_src_28000.paid_at) AS paid_at__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.paid_at) AS paid_at__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.paid_at) AS paid_at__year
+ , EXTRACT(year FROM bookings_source_src_28000.paid_at) AS paid_at__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.paid_at) AS paid_at__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.paid_at) AS paid_at__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.paid_at) AS paid_at__extract_day
+ , CASE WHEN EXTRACT(dow FROM bookings_source_src_28000.paid_at) = 0 THEN EXTRACT(dow FROM bookings_source_src_28000.paid_at) + 7 ELSE EXTRACT(dow FROM bookings_source_src_28000.paid_at) END AS paid_at__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.paid_at) AS paid_at__extract_doy
+ , bookings_source_src_28000.is_instant AS booking__is_instant
+ , DATE_TRUNC('day', bookings_source_src_28000.ds) AS booking__ds__day
+ , DATE_TRUNC('week', bookings_source_src_28000.ds) AS booking__ds__week
+ , DATE_TRUNC('month', bookings_source_src_28000.ds) AS booking__ds__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.ds) AS booking__ds__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.ds) AS booking__ds__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds) AS booking__ds__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds) AS booking__ds__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds) AS booking__ds__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds) AS booking__ds__extract_day
+ , CASE WHEN EXTRACT(dow FROM bookings_source_src_28000.ds) = 0 THEN EXTRACT(dow FROM bookings_source_src_28000.ds) + 7 ELSE EXTRACT(dow FROM bookings_source_src_28000.ds) END AS booking__ds__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.ds) AS booking__ds__extract_doy
+ , DATE_TRUNC('day', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__day
+ , DATE_TRUNC('week', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__week
+ , DATE_TRUNC('month', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_day
+ , CASE WHEN EXTRACT(dow FROM bookings_source_src_28000.ds_partitioned) = 0 THEN EXTRACT(dow FROM bookings_source_src_28000.ds_partitioned) + 7 ELSE EXTRACT(dow FROM bookings_source_src_28000.ds_partitioned) END AS booking__ds_partitioned__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_doy
+ , DATE_TRUNC('day', bookings_source_src_28000.paid_at) AS booking__paid_at__day
+ , DATE_TRUNC('week', bookings_source_src_28000.paid_at) AS booking__paid_at__week
+ , DATE_TRUNC('month', bookings_source_src_28000.paid_at) AS booking__paid_at__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.paid_at) AS booking__paid_at__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.paid_at) AS booking__paid_at__year
+ , EXTRACT(year FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_day
+ , CASE WHEN EXTRACT(dow FROM bookings_source_src_28000.paid_at) = 0 THEN EXTRACT(dow FROM bookings_source_src_28000.paid_at) + 7 ELSE EXTRACT(dow FROM bookings_source_src_28000.paid_at) END AS booking__paid_at__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_doy
+ , bookings_source_src_28000.listing_id AS listing
+ , bookings_source_src_28000.guest_id AS guest
+ , bookings_source_src_28000.host_id AS host
+ , bookings_source_src_28000.listing_id AS booking__listing
+ , bookings_source_src_28000.guest_id AS booking__guest
+ , bookings_source_src_28000.host_id AS booking__host
+ FROM ***************************.fct_bookings bookings_source_src_28000
+ ) subq_0
+ ) subq_1
+ ) subq_2
+ GROUP BY
+ subq_2.booking__is_instant
+ ) subq_3
+ ) subq_4
+ ) subq_5
+ FULL OUTER JOIN (
+ -- Compute Metrics via Expressions
+ SELECT
+ subq_10.booking__is_instant
+ , shared_alias + 10 AS derived_shared_alias_2
+ FROM (
+ -- Compute Metrics via Expressions
+ SELECT
+ subq_9.booking__is_instant
+ , subq_9.instant_bookings AS shared_alias
+ FROM (
+ -- Aggregate Measures
+ SELECT
+ subq_8.booking__is_instant
+ , SUM(subq_8.instant_bookings) AS instant_bookings
+ FROM (
+ -- Pass Only Elements: ['instant_bookings', 'booking__is_instant']
+ SELECT
+ subq_7.booking__is_instant
+ , subq_7.instant_bookings
+ FROM (
+ -- Metric Time Dimension 'ds'
+ SELECT
+ subq_6.ds__day
+ , subq_6.ds__week
+ , subq_6.ds__month
+ , subq_6.ds__quarter
+ , subq_6.ds__year
+ , subq_6.ds__extract_year
+ , subq_6.ds__extract_quarter
+ , subq_6.ds__extract_month
+ , subq_6.ds__extract_day
+ , subq_6.ds__extract_dow
+ , subq_6.ds__extract_doy
+ , subq_6.ds_partitioned__day
+ , subq_6.ds_partitioned__week
+ , subq_6.ds_partitioned__month
+ , subq_6.ds_partitioned__quarter
+ , subq_6.ds_partitioned__year
+ , subq_6.ds_partitioned__extract_year
+ , subq_6.ds_partitioned__extract_quarter
+ , subq_6.ds_partitioned__extract_month
+ , subq_6.ds_partitioned__extract_day
+ , subq_6.ds_partitioned__extract_dow
+ , subq_6.ds_partitioned__extract_doy
+ , subq_6.paid_at__day
+ , subq_6.paid_at__week
+ , subq_6.paid_at__month
+ , subq_6.paid_at__quarter
+ , subq_6.paid_at__year
+ , subq_6.paid_at__extract_year
+ , subq_6.paid_at__extract_quarter
+ , subq_6.paid_at__extract_month
+ , subq_6.paid_at__extract_day
+ , subq_6.paid_at__extract_dow
+ , subq_6.paid_at__extract_doy
+ , subq_6.booking__ds__day
+ , subq_6.booking__ds__week
+ , subq_6.booking__ds__month
+ , subq_6.booking__ds__quarter
+ , subq_6.booking__ds__year
+ , subq_6.booking__ds__extract_year
+ , subq_6.booking__ds__extract_quarter
+ , subq_6.booking__ds__extract_month
+ , subq_6.booking__ds__extract_day
+ , subq_6.booking__ds__extract_dow
+ , subq_6.booking__ds__extract_doy
+ , subq_6.booking__ds_partitioned__day
+ , subq_6.booking__ds_partitioned__week
+ , subq_6.booking__ds_partitioned__month
+ , subq_6.booking__ds_partitioned__quarter
+ , subq_6.booking__ds_partitioned__year
+ , subq_6.booking__ds_partitioned__extract_year
+ , subq_6.booking__ds_partitioned__extract_quarter
+ , subq_6.booking__ds_partitioned__extract_month
+ , subq_6.booking__ds_partitioned__extract_day
+ , subq_6.booking__ds_partitioned__extract_dow
+ , subq_6.booking__ds_partitioned__extract_doy
+ , subq_6.booking__paid_at__day
+ , subq_6.booking__paid_at__week
+ , subq_6.booking__paid_at__month
+ , subq_6.booking__paid_at__quarter
+ , subq_6.booking__paid_at__year
+ , subq_6.booking__paid_at__extract_year
+ , subq_6.booking__paid_at__extract_quarter
+ , subq_6.booking__paid_at__extract_month
+ , subq_6.booking__paid_at__extract_day
+ , subq_6.booking__paid_at__extract_dow
+ , subq_6.booking__paid_at__extract_doy
+ , subq_6.ds__day AS metric_time__day
+ , subq_6.ds__week AS metric_time__week
+ , subq_6.ds__month AS metric_time__month
+ , subq_6.ds__quarter AS metric_time__quarter
+ , subq_6.ds__year AS metric_time__year
+ , subq_6.ds__extract_year AS metric_time__extract_year
+ , subq_6.ds__extract_quarter AS metric_time__extract_quarter
+ , subq_6.ds__extract_month AS metric_time__extract_month
+ , subq_6.ds__extract_day AS metric_time__extract_day
+ , subq_6.ds__extract_dow AS metric_time__extract_dow
+ , subq_6.ds__extract_doy AS metric_time__extract_doy
+ , subq_6.listing
+ , subq_6.guest
+ , subq_6.host
+ , subq_6.booking__listing
+ , subq_6.booking__guest
+ , subq_6.booking__host
+ , subq_6.is_instant
+ , subq_6.booking__is_instant
+ , subq_6.bookings
+ , subq_6.instant_bookings
+ , subq_6.booking_value
+ , subq_6.max_booking_value
+ , subq_6.min_booking_value
+ , subq_6.bookers
+ , subq_6.average_booking_value
+ , subq_6.referred_bookings
+ , subq_6.median_booking_value
+ , subq_6.booking_value_p99
+ , subq_6.discrete_booking_value_p99
+ , subq_6.approximate_continuous_booking_value_p99
+ , subq_6.approximate_discrete_booking_value_p99
+ FROM (
+ -- Read Elements From Semantic Model 'bookings_source'
+ SELECT
+ 1 AS bookings
+ , CASE WHEN is_instant THEN 1 ELSE 0 END AS instant_bookings
+ , bookings_source_src_28000.booking_value
+ , bookings_source_src_28000.booking_value AS max_booking_value
+ , bookings_source_src_28000.booking_value AS min_booking_value
+ , bookings_source_src_28000.guest_id AS bookers
+ , bookings_source_src_28000.booking_value AS average_booking_value
+ , bookings_source_src_28000.booking_value AS booking_payments
+ , CASE WHEN referrer_id IS NOT NULL THEN 1 ELSE 0 END AS referred_bookings
+ , bookings_source_src_28000.booking_value AS median_booking_value
+ , bookings_source_src_28000.booking_value AS booking_value_p99
+ , bookings_source_src_28000.booking_value AS discrete_booking_value_p99
+ , bookings_source_src_28000.booking_value AS approximate_continuous_booking_value_p99
+ , bookings_source_src_28000.booking_value AS approximate_discrete_booking_value_p99
+ , bookings_source_src_28000.is_instant
+ , DATE_TRUNC('day', bookings_source_src_28000.ds) AS ds__day
+ , DATE_TRUNC('week', bookings_source_src_28000.ds) AS ds__week
+ , DATE_TRUNC('month', bookings_source_src_28000.ds) AS ds__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.ds) AS ds__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.ds) AS ds__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds) AS ds__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds) AS ds__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds) AS ds__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds) AS ds__extract_day
+ , CASE WHEN EXTRACT(dow FROM bookings_source_src_28000.ds) = 0 THEN EXTRACT(dow FROM bookings_source_src_28000.ds) + 7 ELSE EXTRACT(dow FROM bookings_source_src_28000.ds) END AS ds__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.ds) AS ds__extract_doy
+ , DATE_TRUNC('day', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__day
+ , DATE_TRUNC('week', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__week
+ , DATE_TRUNC('month', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_day
+ , CASE WHEN EXTRACT(dow FROM bookings_source_src_28000.ds_partitioned) = 0 THEN EXTRACT(dow FROM bookings_source_src_28000.ds_partitioned) + 7 ELSE EXTRACT(dow FROM bookings_source_src_28000.ds_partitioned) END AS ds_partitioned__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_doy
+ , DATE_TRUNC('day', bookings_source_src_28000.paid_at) AS paid_at__day
+ , DATE_TRUNC('week', bookings_source_src_28000.paid_at) AS paid_at__week
+ , DATE_TRUNC('month', bookings_source_src_28000.paid_at) AS paid_at__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.paid_at) AS paid_at__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.paid_at) AS paid_at__year
+ , EXTRACT(year FROM bookings_source_src_28000.paid_at) AS paid_at__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.paid_at) AS paid_at__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.paid_at) AS paid_at__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.paid_at) AS paid_at__extract_day
+ , CASE WHEN EXTRACT(dow FROM bookings_source_src_28000.paid_at) = 0 THEN EXTRACT(dow FROM bookings_source_src_28000.paid_at) + 7 ELSE EXTRACT(dow FROM bookings_source_src_28000.paid_at) END AS paid_at__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.paid_at) AS paid_at__extract_doy
+ , bookings_source_src_28000.is_instant AS booking__is_instant
+ , DATE_TRUNC('day', bookings_source_src_28000.ds) AS booking__ds__day
+ , DATE_TRUNC('week', bookings_source_src_28000.ds) AS booking__ds__week
+ , DATE_TRUNC('month', bookings_source_src_28000.ds) AS booking__ds__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.ds) AS booking__ds__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.ds) AS booking__ds__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds) AS booking__ds__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds) AS booking__ds__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds) AS booking__ds__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds) AS booking__ds__extract_day
+ , CASE WHEN EXTRACT(dow FROM bookings_source_src_28000.ds) = 0 THEN EXTRACT(dow FROM bookings_source_src_28000.ds) + 7 ELSE EXTRACT(dow FROM bookings_source_src_28000.ds) END AS booking__ds__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.ds) AS booking__ds__extract_doy
+ , DATE_TRUNC('day', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__day
+ , DATE_TRUNC('week', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__week
+ , DATE_TRUNC('month', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_day
+ , CASE WHEN EXTRACT(dow FROM bookings_source_src_28000.ds_partitioned) = 0 THEN EXTRACT(dow FROM bookings_source_src_28000.ds_partitioned) + 7 ELSE EXTRACT(dow FROM bookings_source_src_28000.ds_partitioned) END AS booking__ds_partitioned__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_doy
+ , DATE_TRUNC('day', bookings_source_src_28000.paid_at) AS booking__paid_at__day
+ , DATE_TRUNC('week', bookings_source_src_28000.paid_at) AS booking__paid_at__week
+ , DATE_TRUNC('month', bookings_source_src_28000.paid_at) AS booking__paid_at__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.paid_at) AS booking__paid_at__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.paid_at) AS booking__paid_at__year
+ , EXTRACT(year FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_day
+ , CASE WHEN EXTRACT(dow FROM bookings_source_src_28000.paid_at) = 0 THEN EXTRACT(dow FROM bookings_source_src_28000.paid_at) + 7 ELSE EXTRACT(dow FROM bookings_source_src_28000.paid_at) END AS booking__paid_at__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_doy
+ , bookings_source_src_28000.listing_id AS listing
+ , bookings_source_src_28000.guest_id AS guest
+ , bookings_source_src_28000.host_id AS host
+ , bookings_source_src_28000.listing_id AS booking__listing
+ , bookings_source_src_28000.guest_id AS booking__guest
+ , bookings_source_src_28000.host_id AS booking__host
+ FROM ***************************.fct_bookings bookings_source_src_28000
+ ) subq_6
+ ) subq_7
+ ) subq_8
+ GROUP BY
+ subq_8.booking__is_instant
+ ) subq_9
+ ) subq_10
+ ) subq_11
+ ON
+ subq_5.booking__is_instant = subq_11.booking__is_instant
+ GROUP BY
+ COALESCE(subq_5.booking__is_instant, subq_11.booking__is_instant)
+) subq_12
+LIMIT 1
diff --git a/tests_metricflow/snapshots/test_derived_metric_rendering.py/SqlQueryPlan/Redshift/test_derived_metric_that_defines_the_same_alias_in_different_components__plan0_optimized.sql b/tests_metricflow/snapshots/test_derived_metric_rendering.py/SqlQueryPlan/Redshift/test_derived_metric_that_defines_the_same_alias_in_different_components__plan0_optimized.sql
new file mode 100644
index 0000000000..6b1c46eee3
--- /dev/null
+++ b/tests_metricflow/snapshots/test_derived_metric_rendering.py/SqlQueryPlan/Redshift/test_derived_metric_that_defines_the_same_alias_in_different_components__plan0_optimized.sql
@@ -0,0 +1,59 @@
+-- Combine Aggregated Outputs
+-- Order By [] Limit 1
+SELECT
+ COALESCE(subq_18.booking__is_instant, subq_24.booking__is_instant) AS booking__is_instant
+ , MAX(subq_18.derived_shared_alias_1a) AS derived_shared_alias_1a
+ , MAX(subq_24.derived_shared_alias_2) AS derived_shared_alias_2
+FROM (
+ -- Compute Metrics via Expressions
+ SELECT
+ booking__is_instant
+ , shared_alias - 10 AS derived_shared_alias_1a
+ FROM (
+ -- Aggregate Measures
+ -- Compute Metrics via Expressions
+ SELECT
+ booking__is_instant
+ , SUM(bookings) AS shared_alias
+ FROM (
+ -- Read Elements From Semantic Model 'bookings_source'
+ -- Metric Time Dimension 'ds'
+ -- Pass Only Elements: ['bookings', 'booking__is_instant']
+ SELECT
+ is_instant AS booking__is_instant
+ , 1 AS bookings
+ FROM ***************************.fct_bookings bookings_source_src_28000
+ ) subq_15
+ GROUP BY
+ booking__is_instant
+ ) subq_17
+) subq_18
+FULL OUTER JOIN (
+ -- Compute Metrics via Expressions
+ SELECT
+ booking__is_instant
+ , shared_alias + 10 AS derived_shared_alias_2
+ FROM (
+ -- Aggregate Measures
+ -- Compute Metrics via Expressions
+ SELECT
+ booking__is_instant
+ , SUM(instant_bookings) AS shared_alias
+ FROM (
+ -- Read Elements From Semantic Model 'bookings_source'
+ -- Metric Time Dimension 'ds'
+ -- Pass Only Elements: ['instant_bookings', 'booking__is_instant']
+ SELECT
+ is_instant AS booking__is_instant
+ , CASE WHEN is_instant THEN 1 ELSE 0 END AS instant_bookings
+ FROM ***************************.fct_bookings bookings_source_src_28000
+ ) subq_21
+ GROUP BY
+ booking__is_instant
+ ) subq_23
+) subq_24
+ON
+ subq_18.booking__is_instant = subq_24.booking__is_instant
+GROUP BY
+ COALESCE(subq_18.booking__is_instant, subq_24.booking__is_instant)
+LIMIT 1
diff --git a/tests_metricflow/snapshots/test_derived_metric_rendering.py/SqlQueryPlan/Snowflake/test_derived_metric_that_defines_the_same_alias_in_different_components__plan0.sql b/tests_metricflow/snapshots/test_derived_metric_rendering.py/SqlQueryPlan/Snowflake/test_derived_metric_that_defines_the_same_alias_in_different_components__plan0.sql
new file mode 100644
index 0000000000..4253fd235f
--- /dev/null
+++ b/tests_metricflow/snapshots/test_derived_metric_rendering.py/SqlQueryPlan/Snowflake/test_derived_metric_that_defines_the_same_alias_in_different_components__plan0.sql
@@ -0,0 +1,459 @@
+-- Order By [] Limit 1
+SELECT
+ subq_12.booking__is_instant
+ , subq_12.derived_shared_alias_1a
+ , subq_12.derived_shared_alias_2
+FROM (
+ -- Combine Aggregated Outputs
+ SELECT
+ COALESCE(subq_5.booking__is_instant, subq_11.booking__is_instant) AS booking__is_instant
+ , MAX(subq_5.derived_shared_alias_1a) AS derived_shared_alias_1a
+ , MAX(subq_11.derived_shared_alias_2) AS derived_shared_alias_2
+ FROM (
+ -- Compute Metrics via Expressions
+ SELECT
+ subq_4.booking__is_instant
+ , shared_alias - 10 AS derived_shared_alias_1a
+ FROM (
+ -- Compute Metrics via Expressions
+ SELECT
+ subq_3.booking__is_instant
+ , subq_3.bookings AS shared_alias
+ FROM (
+ -- Aggregate Measures
+ SELECT
+ subq_2.booking__is_instant
+ , SUM(subq_2.bookings) AS bookings
+ FROM (
+ -- Pass Only Elements: ['bookings', 'booking__is_instant']
+ SELECT
+ subq_1.booking__is_instant
+ , subq_1.bookings
+ FROM (
+ -- Metric Time Dimension 'ds'
+ SELECT
+ subq_0.ds__day
+ , subq_0.ds__week
+ , subq_0.ds__month
+ , subq_0.ds__quarter
+ , subq_0.ds__year
+ , subq_0.ds__extract_year
+ , subq_0.ds__extract_quarter
+ , subq_0.ds__extract_month
+ , subq_0.ds__extract_day
+ , subq_0.ds__extract_dow
+ , subq_0.ds__extract_doy
+ , subq_0.ds_partitioned__day
+ , subq_0.ds_partitioned__week
+ , subq_0.ds_partitioned__month
+ , subq_0.ds_partitioned__quarter
+ , subq_0.ds_partitioned__year
+ , subq_0.ds_partitioned__extract_year
+ , subq_0.ds_partitioned__extract_quarter
+ , subq_0.ds_partitioned__extract_month
+ , subq_0.ds_partitioned__extract_day
+ , subq_0.ds_partitioned__extract_dow
+ , subq_0.ds_partitioned__extract_doy
+ , subq_0.paid_at__day
+ , subq_0.paid_at__week
+ , subq_0.paid_at__month
+ , subq_0.paid_at__quarter
+ , subq_0.paid_at__year
+ , subq_0.paid_at__extract_year
+ , subq_0.paid_at__extract_quarter
+ , subq_0.paid_at__extract_month
+ , subq_0.paid_at__extract_day
+ , subq_0.paid_at__extract_dow
+ , subq_0.paid_at__extract_doy
+ , subq_0.booking__ds__day
+ , subq_0.booking__ds__week
+ , subq_0.booking__ds__month
+ , subq_0.booking__ds__quarter
+ , subq_0.booking__ds__year
+ , subq_0.booking__ds__extract_year
+ , subq_0.booking__ds__extract_quarter
+ , subq_0.booking__ds__extract_month
+ , subq_0.booking__ds__extract_day
+ , subq_0.booking__ds__extract_dow
+ , subq_0.booking__ds__extract_doy
+ , subq_0.booking__ds_partitioned__day
+ , subq_0.booking__ds_partitioned__week
+ , subq_0.booking__ds_partitioned__month
+ , subq_0.booking__ds_partitioned__quarter
+ , subq_0.booking__ds_partitioned__year
+ , subq_0.booking__ds_partitioned__extract_year
+ , subq_0.booking__ds_partitioned__extract_quarter
+ , subq_0.booking__ds_partitioned__extract_month
+ , subq_0.booking__ds_partitioned__extract_day
+ , subq_0.booking__ds_partitioned__extract_dow
+ , subq_0.booking__ds_partitioned__extract_doy
+ , subq_0.booking__paid_at__day
+ , subq_0.booking__paid_at__week
+ , subq_0.booking__paid_at__month
+ , subq_0.booking__paid_at__quarter
+ , subq_0.booking__paid_at__year
+ , subq_0.booking__paid_at__extract_year
+ , subq_0.booking__paid_at__extract_quarter
+ , subq_0.booking__paid_at__extract_month
+ , subq_0.booking__paid_at__extract_day
+ , subq_0.booking__paid_at__extract_dow
+ , subq_0.booking__paid_at__extract_doy
+ , subq_0.ds__day AS metric_time__day
+ , subq_0.ds__week AS metric_time__week
+ , subq_0.ds__month AS metric_time__month
+ , subq_0.ds__quarter AS metric_time__quarter
+ , subq_0.ds__year AS metric_time__year
+ , subq_0.ds__extract_year AS metric_time__extract_year
+ , subq_0.ds__extract_quarter AS metric_time__extract_quarter
+ , subq_0.ds__extract_month AS metric_time__extract_month
+ , subq_0.ds__extract_day AS metric_time__extract_day
+ , subq_0.ds__extract_dow AS metric_time__extract_dow
+ , subq_0.ds__extract_doy AS metric_time__extract_doy
+ , subq_0.listing
+ , subq_0.guest
+ , subq_0.host
+ , subq_0.booking__listing
+ , subq_0.booking__guest
+ , subq_0.booking__host
+ , subq_0.is_instant
+ , subq_0.booking__is_instant
+ , subq_0.bookings
+ , subq_0.instant_bookings
+ , subq_0.booking_value
+ , subq_0.max_booking_value
+ , subq_0.min_booking_value
+ , subq_0.bookers
+ , subq_0.average_booking_value
+ , subq_0.referred_bookings
+ , subq_0.median_booking_value
+ , subq_0.booking_value_p99
+ , subq_0.discrete_booking_value_p99
+ , subq_0.approximate_continuous_booking_value_p99
+ , subq_0.approximate_discrete_booking_value_p99
+ FROM (
+ -- Read Elements From Semantic Model 'bookings_source'
+ SELECT
+ 1 AS bookings
+ , CASE WHEN is_instant THEN 1 ELSE 0 END AS instant_bookings
+ , bookings_source_src_28000.booking_value
+ , bookings_source_src_28000.booking_value AS max_booking_value
+ , bookings_source_src_28000.booking_value AS min_booking_value
+ , bookings_source_src_28000.guest_id AS bookers
+ , bookings_source_src_28000.booking_value AS average_booking_value
+ , bookings_source_src_28000.booking_value AS booking_payments
+ , CASE WHEN referrer_id IS NOT NULL THEN 1 ELSE 0 END AS referred_bookings
+ , bookings_source_src_28000.booking_value AS median_booking_value
+ , bookings_source_src_28000.booking_value AS booking_value_p99
+ , bookings_source_src_28000.booking_value AS discrete_booking_value_p99
+ , bookings_source_src_28000.booking_value AS approximate_continuous_booking_value_p99
+ , bookings_source_src_28000.booking_value AS approximate_discrete_booking_value_p99
+ , bookings_source_src_28000.is_instant
+ , DATE_TRUNC('day', bookings_source_src_28000.ds) AS ds__day
+ , DATE_TRUNC('week', bookings_source_src_28000.ds) AS ds__week
+ , DATE_TRUNC('month', bookings_source_src_28000.ds) AS ds__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.ds) AS ds__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.ds) AS ds__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds) AS ds__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds) AS ds__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds) AS ds__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds) AS ds__extract_day
+ , EXTRACT(dayofweekiso FROM bookings_source_src_28000.ds) AS ds__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.ds) AS ds__extract_doy
+ , DATE_TRUNC('day', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__day
+ , DATE_TRUNC('week', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__week
+ , DATE_TRUNC('month', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_day
+ , EXTRACT(dayofweekiso FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_doy
+ , DATE_TRUNC('day', bookings_source_src_28000.paid_at) AS paid_at__day
+ , DATE_TRUNC('week', bookings_source_src_28000.paid_at) AS paid_at__week
+ , DATE_TRUNC('month', bookings_source_src_28000.paid_at) AS paid_at__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.paid_at) AS paid_at__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.paid_at) AS paid_at__year
+ , EXTRACT(year FROM bookings_source_src_28000.paid_at) AS paid_at__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.paid_at) AS paid_at__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.paid_at) AS paid_at__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.paid_at) AS paid_at__extract_day
+ , EXTRACT(dayofweekiso FROM bookings_source_src_28000.paid_at) AS paid_at__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.paid_at) AS paid_at__extract_doy
+ , bookings_source_src_28000.is_instant AS booking__is_instant
+ , DATE_TRUNC('day', bookings_source_src_28000.ds) AS booking__ds__day
+ , DATE_TRUNC('week', bookings_source_src_28000.ds) AS booking__ds__week
+ , DATE_TRUNC('month', bookings_source_src_28000.ds) AS booking__ds__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.ds) AS booking__ds__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.ds) AS booking__ds__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds) AS booking__ds__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds) AS booking__ds__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds) AS booking__ds__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds) AS booking__ds__extract_day
+ , EXTRACT(dayofweekiso FROM bookings_source_src_28000.ds) AS booking__ds__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.ds) AS booking__ds__extract_doy
+ , DATE_TRUNC('day', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__day
+ , DATE_TRUNC('week', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__week
+ , DATE_TRUNC('month', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_day
+ , EXTRACT(dayofweekiso FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_doy
+ , DATE_TRUNC('day', bookings_source_src_28000.paid_at) AS booking__paid_at__day
+ , DATE_TRUNC('week', bookings_source_src_28000.paid_at) AS booking__paid_at__week
+ , DATE_TRUNC('month', bookings_source_src_28000.paid_at) AS booking__paid_at__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.paid_at) AS booking__paid_at__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.paid_at) AS booking__paid_at__year
+ , EXTRACT(year FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_day
+ , EXTRACT(dayofweekiso FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_doy
+ , bookings_source_src_28000.listing_id AS listing
+ , bookings_source_src_28000.guest_id AS guest
+ , bookings_source_src_28000.host_id AS host
+ , bookings_source_src_28000.listing_id AS booking__listing
+ , bookings_source_src_28000.guest_id AS booking__guest
+ , bookings_source_src_28000.host_id AS booking__host
+ FROM ***************************.fct_bookings bookings_source_src_28000
+ ) subq_0
+ ) subq_1
+ ) subq_2
+ GROUP BY
+ subq_2.booking__is_instant
+ ) subq_3
+ ) subq_4
+ ) subq_5
+ FULL OUTER JOIN (
+ -- Compute Metrics via Expressions
+ SELECT
+ subq_10.booking__is_instant
+ , shared_alias + 10 AS derived_shared_alias_2
+ FROM (
+ -- Compute Metrics via Expressions
+ SELECT
+ subq_9.booking__is_instant
+ , subq_9.instant_bookings AS shared_alias
+ FROM (
+ -- Aggregate Measures
+ SELECT
+ subq_8.booking__is_instant
+ , SUM(subq_8.instant_bookings) AS instant_bookings
+ FROM (
+ -- Pass Only Elements: ['instant_bookings', 'booking__is_instant']
+ SELECT
+ subq_7.booking__is_instant
+ , subq_7.instant_bookings
+ FROM (
+ -- Metric Time Dimension 'ds'
+ SELECT
+ subq_6.ds__day
+ , subq_6.ds__week
+ , subq_6.ds__month
+ , subq_6.ds__quarter
+ , subq_6.ds__year
+ , subq_6.ds__extract_year
+ , subq_6.ds__extract_quarter
+ , subq_6.ds__extract_month
+ , subq_6.ds__extract_day
+ , subq_6.ds__extract_dow
+ , subq_6.ds__extract_doy
+ , subq_6.ds_partitioned__day
+ , subq_6.ds_partitioned__week
+ , subq_6.ds_partitioned__month
+ , subq_6.ds_partitioned__quarter
+ , subq_6.ds_partitioned__year
+ , subq_6.ds_partitioned__extract_year
+ , subq_6.ds_partitioned__extract_quarter
+ , subq_6.ds_partitioned__extract_month
+ , subq_6.ds_partitioned__extract_day
+ , subq_6.ds_partitioned__extract_dow
+ , subq_6.ds_partitioned__extract_doy
+ , subq_6.paid_at__day
+ , subq_6.paid_at__week
+ , subq_6.paid_at__month
+ , subq_6.paid_at__quarter
+ , subq_6.paid_at__year
+ , subq_6.paid_at__extract_year
+ , subq_6.paid_at__extract_quarter
+ , subq_6.paid_at__extract_month
+ , subq_6.paid_at__extract_day
+ , subq_6.paid_at__extract_dow
+ , subq_6.paid_at__extract_doy
+ , subq_6.booking__ds__day
+ , subq_6.booking__ds__week
+ , subq_6.booking__ds__month
+ , subq_6.booking__ds__quarter
+ , subq_6.booking__ds__year
+ , subq_6.booking__ds__extract_year
+ , subq_6.booking__ds__extract_quarter
+ , subq_6.booking__ds__extract_month
+ , subq_6.booking__ds__extract_day
+ , subq_6.booking__ds__extract_dow
+ , subq_6.booking__ds__extract_doy
+ , subq_6.booking__ds_partitioned__day
+ , subq_6.booking__ds_partitioned__week
+ , subq_6.booking__ds_partitioned__month
+ , subq_6.booking__ds_partitioned__quarter
+ , subq_6.booking__ds_partitioned__year
+ , subq_6.booking__ds_partitioned__extract_year
+ , subq_6.booking__ds_partitioned__extract_quarter
+ , subq_6.booking__ds_partitioned__extract_month
+ , subq_6.booking__ds_partitioned__extract_day
+ , subq_6.booking__ds_partitioned__extract_dow
+ , subq_6.booking__ds_partitioned__extract_doy
+ , subq_6.booking__paid_at__day
+ , subq_6.booking__paid_at__week
+ , subq_6.booking__paid_at__month
+ , subq_6.booking__paid_at__quarter
+ , subq_6.booking__paid_at__year
+ , subq_6.booking__paid_at__extract_year
+ , subq_6.booking__paid_at__extract_quarter
+ , subq_6.booking__paid_at__extract_month
+ , subq_6.booking__paid_at__extract_day
+ , subq_6.booking__paid_at__extract_dow
+ , subq_6.booking__paid_at__extract_doy
+ , subq_6.ds__day AS metric_time__day
+ , subq_6.ds__week AS metric_time__week
+ , subq_6.ds__month AS metric_time__month
+ , subq_6.ds__quarter AS metric_time__quarter
+ , subq_6.ds__year AS metric_time__year
+ , subq_6.ds__extract_year AS metric_time__extract_year
+ , subq_6.ds__extract_quarter AS metric_time__extract_quarter
+ , subq_6.ds__extract_month AS metric_time__extract_month
+ , subq_6.ds__extract_day AS metric_time__extract_day
+ , subq_6.ds__extract_dow AS metric_time__extract_dow
+ , subq_6.ds__extract_doy AS metric_time__extract_doy
+ , subq_6.listing
+ , subq_6.guest
+ , subq_6.host
+ , subq_6.booking__listing
+ , subq_6.booking__guest
+ , subq_6.booking__host
+ , subq_6.is_instant
+ , subq_6.booking__is_instant
+ , subq_6.bookings
+ , subq_6.instant_bookings
+ , subq_6.booking_value
+ , subq_6.max_booking_value
+ , subq_6.min_booking_value
+ , subq_6.bookers
+ , subq_6.average_booking_value
+ , subq_6.referred_bookings
+ , subq_6.median_booking_value
+ , subq_6.booking_value_p99
+ , subq_6.discrete_booking_value_p99
+ , subq_6.approximate_continuous_booking_value_p99
+ , subq_6.approximate_discrete_booking_value_p99
+ FROM (
+ -- Read Elements From Semantic Model 'bookings_source'
+ SELECT
+ 1 AS bookings
+ , CASE WHEN is_instant THEN 1 ELSE 0 END AS instant_bookings
+ , bookings_source_src_28000.booking_value
+ , bookings_source_src_28000.booking_value AS max_booking_value
+ , bookings_source_src_28000.booking_value AS min_booking_value
+ , bookings_source_src_28000.guest_id AS bookers
+ , bookings_source_src_28000.booking_value AS average_booking_value
+ , bookings_source_src_28000.booking_value AS booking_payments
+ , CASE WHEN referrer_id IS NOT NULL THEN 1 ELSE 0 END AS referred_bookings
+ , bookings_source_src_28000.booking_value AS median_booking_value
+ , bookings_source_src_28000.booking_value AS booking_value_p99
+ , bookings_source_src_28000.booking_value AS discrete_booking_value_p99
+ , bookings_source_src_28000.booking_value AS approximate_continuous_booking_value_p99
+ , bookings_source_src_28000.booking_value AS approximate_discrete_booking_value_p99
+ , bookings_source_src_28000.is_instant
+ , DATE_TRUNC('day', bookings_source_src_28000.ds) AS ds__day
+ , DATE_TRUNC('week', bookings_source_src_28000.ds) AS ds__week
+ , DATE_TRUNC('month', bookings_source_src_28000.ds) AS ds__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.ds) AS ds__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.ds) AS ds__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds) AS ds__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds) AS ds__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds) AS ds__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds) AS ds__extract_day
+ , EXTRACT(dayofweekiso FROM bookings_source_src_28000.ds) AS ds__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.ds) AS ds__extract_doy
+ , DATE_TRUNC('day', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__day
+ , DATE_TRUNC('week', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__week
+ , DATE_TRUNC('month', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_day
+ , EXTRACT(dayofweekiso FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_doy
+ , DATE_TRUNC('day', bookings_source_src_28000.paid_at) AS paid_at__day
+ , DATE_TRUNC('week', bookings_source_src_28000.paid_at) AS paid_at__week
+ , DATE_TRUNC('month', bookings_source_src_28000.paid_at) AS paid_at__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.paid_at) AS paid_at__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.paid_at) AS paid_at__year
+ , EXTRACT(year FROM bookings_source_src_28000.paid_at) AS paid_at__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.paid_at) AS paid_at__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.paid_at) AS paid_at__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.paid_at) AS paid_at__extract_day
+ , EXTRACT(dayofweekiso FROM bookings_source_src_28000.paid_at) AS paid_at__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.paid_at) AS paid_at__extract_doy
+ , bookings_source_src_28000.is_instant AS booking__is_instant
+ , DATE_TRUNC('day', bookings_source_src_28000.ds) AS booking__ds__day
+ , DATE_TRUNC('week', bookings_source_src_28000.ds) AS booking__ds__week
+ , DATE_TRUNC('month', bookings_source_src_28000.ds) AS booking__ds__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.ds) AS booking__ds__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.ds) AS booking__ds__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds) AS booking__ds__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds) AS booking__ds__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds) AS booking__ds__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds) AS booking__ds__extract_day
+ , EXTRACT(dayofweekiso FROM bookings_source_src_28000.ds) AS booking__ds__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.ds) AS booking__ds__extract_doy
+ , DATE_TRUNC('day', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__day
+ , DATE_TRUNC('week', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__week
+ , DATE_TRUNC('month', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_day
+ , EXTRACT(dayofweekiso FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_doy
+ , DATE_TRUNC('day', bookings_source_src_28000.paid_at) AS booking__paid_at__day
+ , DATE_TRUNC('week', bookings_source_src_28000.paid_at) AS booking__paid_at__week
+ , DATE_TRUNC('month', bookings_source_src_28000.paid_at) AS booking__paid_at__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.paid_at) AS booking__paid_at__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.paid_at) AS booking__paid_at__year
+ , EXTRACT(year FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_day
+ , EXTRACT(dayofweekiso FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_doy
+ , bookings_source_src_28000.listing_id AS listing
+ , bookings_source_src_28000.guest_id AS guest
+ , bookings_source_src_28000.host_id AS host
+ , bookings_source_src_28000.listing_id AS booking__listing
+ , bookings_source_src_28000.guest_id AS booking__guest
+ , bookings_source_src_28000.host_id AS booking__host
+ FROM ***************************.fct_bookings bookings_source_src_28000
+ ) subq_6
+ ) subq_7
+ ) subq_8
+ GROUP BY
+ subq_8.booking__is_instant
+ ) subq_9
+ ) subq_10
+ ) subq_11
+ ON
+ subq_5.booking__is_instant = subq_11.booking__is_instant
+ GROUP BY
+ COALESCE(subq_5.booking__is_instant, subq_11.booking__is_instant)
+) subq_12
+LIMIT 1
diff --git a/tests_metricflow/snapshots/test_derived_metric_rendering.py/SqlQueryPlan/Snowflake/test_derived_metric_that_defines_the_same_alias_in_different_components__plan0_optimized.sql b/tests_metricflow/snapshots/test_derived_metric_rendering.py/SqlQueryPlan/Snowflake/test_derived_metric_that_defines_the_same_alias_in_different_components__plan0_optimized.sql
new file mode 100644
index 0000000000..6b1c46eee3
--- /dev/null
+++ b/tests_metricflow/snapshots/test_derived_metric_rendering.py/SqlQueryPlan/Snowflake/test_derived_metric_that_defines_the_same_alias_in_different_components__plan0_optimized.sql
@@ -0,0 +1,59 @@
+-- Combine Aggregated Outputs
+-- Order By [] Limit 1
+SELECT
+ COALESCE(subq_18.booking__is_instant, subq_24.booking__is_instant) AS booking__is_instant
+ , MAX(subq_18.derived_shared_alias_1a) AS derived_shared_alias_1a
+ , MAX(subq_24.derived_shared_alias_2) AS derived_shared_alias_2
+FROM (
+ -- Compute Metrics via Expressions
+ SELECT
+ booking__is_instant
+ , shared_alias - 10 AS derived_shared_alias_1a
+ FROM (
+ -- Aggregate Measures
+ -- Compute Metrics via Expressions
+ SELECT
+ booking__is_instant
+ , SUM(bookings) AS shared_alias
+ FROM (
+ -- Read Elements From Semantic Model 'bookings_source'
+ -- Metric Time Dimension 'ds'
+ -- Pass Only Elements: ['bookings', 'booking__is_instant']
+ SELECT
+ is_instant AS booking__is_instant
+ , 1 AS bookings
+ FROM ***************************.fct_bookings bookings_source_src_28000
+ ) subq_15
+ GROUP BY
+ booking__is_instant
+ ) subq_17
+) subq_18
+FULL OUTER JOIN (
+ -- Compute Metrics via Expressions
+ SELECT
+ booking__is_instant
+ , shared_alias + 10 AS derived_shared_alias_2
+ FROM (
+ -- Aggregate Measures
+ -- Compute Metrics via Expressions
+ SELECT
+ booking__is_instant
+ , SUM(instant_bookings) AS shared_alias
+ FROM (
+ -- Read Elements From Semantic Model 'bookings_source'
+ -- Metric Time Dimension 'ds'
+ -- Pass Only Elements: ['instant_bookings', 'booking__is_instant']
+ SELECT
+ is_instant AS booking__is_instant
+ , CASE WHEN is_instant THEN 1 ELSE 0 END AS instant_bookings
+ FROM ***************************.fct_bookings bookings_source_src_28000
+ ) subq_21
+ GROUP BY
+ booking__is_instant
+ ) subq_23
+) subq_24
+ON
+ subq_18.booking__is_instant = subq_24.booking__is_instant
+GROUP BY
+ COALESCE(subq_18.booking__is_instant, subq_24.booking__is_instant)
+LIMIT 1
diff --git a/tests_metricflow/snapshots/test_derived_metric_rendering.py/SqlQueryPlan/Trino/test_derived_metric_that_defines_the_same_alias_in_different_components__plan0.sql b/tests_metricflow/snapshots/test_derived_metric_rendering.py/SqlQueryPlan/Trino/test_derived_metric_that_defines_the_same_alias_in_different_components__plan0.sql
new file mode 100644
index 0000000000..de48d5aa70
--- /dev/null
+++ b/tests_metricflow/snapshots/test_derived_metric_rendering.py/SqlQueryPlan/Trino/test_derived_metric_that_defines_the_same_alias_in_different_components__plan0.sql
@@ -0,0 +1,459 @@
+-- Order By [] Limit 1
+SELECT
+ subq_12.booking__is_instant
+ , subq_12.derived_shared_alias_1a
+ , subq_12.derived_shared_alias_2
+FROM (
+ -- Combine Aggregated Outputs
+ SELECT
+ COALESCE(subq_5.booking__is_instant, subq_11.booking__is_instant) AS booking__is_instant
+ , MAX(subq_5.derived_shared_alias_1a) AS derived_shared_alias_1a
+ , MAX(subq_11.derived_shared_alias_2) AS derived_shared_alias_2
+ FROM (
+ -- Compute Metrics via Expressions
+ SELECT
+ subq_4.booking__is_instant
+ , shared_alias - 10 AS derived_shared_alias_1a
+ FROM (
+ -- Compute Metrics via Expressions
+ SELECT
+ subq_3.booking__is_instant
+ , subq_3.bookings AS shared_alias
+ FROM (
+ -- Aggregate Measures
+ SELECT
+ subq_2.booking__is_instant
+ , SUM(subq_2.bookings) AS bookings
+ FROM (
+ -- Pass Only Elements: ['bookings', 'booking__is_instant']
+ SELECT
+ subq_1.booking__is_instant
+ , subq_1.bookings
+ FROM (
+ -- Metric Time Dimension 'ds'
+ SELECT
+ subq_0.ds__day
+ , subq_0.ds__week
+ , subq_0.ds__month
+ , subq_0.ds__quarter
+ , subq_0.ds__year
+ , subq_0.ds__extract_year
+ , subq_0.ds__extract_quarter
+ , subq_0.ds__extract_month
+ , subq_0.ds__extract_day
+ , subq_0.ds__extract_dow
+ , subq_0.ds__extract_doy
+ , subq_0.ds_partitioned__day
+ , subq_0.ds_partitioned__week
+ , subq_0.ds_partitioned__month
+ , subq_0.ds_partitioned__quarter
+ , subq_0.ds_partitioned__year
+ , subq_0.ds_partitioned__extract_year
+ , subq_0.ds_partitioned__extract_quarter
+ , subq_0.ds_partitioned__extract_month
+ , subq_0.ds_partitioned__extract_day
+ , subq_0.ds_partitioned__extract_dow
+ , subq_0.ds_partitioned__extract_doy
+ , subq_0.paid_at__day
+ , subq_0.paid_at__week
+ , subq_0.paid_at__month
+ , subq_0.paid_at__quarter
+ , subq_0.paid_at__year
+ , subq_0.paid_at__extract_year
+ , subq_0.paid_at__extract_quarter
+ , subq_0.paid_at__extract_month
+ , subq_0.paid_at__extract_day
+ , subq_0.paid_at__extract_dow
+ , subq_0.paid_at__extract_doy
+ , subq_0.booking__ds__day
+ , subq_0.booking__ds__week
+ , subq_0.booking__ds__month
+ , subq_0.booking__ds__quarter
+ , subq_0.booking__ds__year
+ , subq_0.booking__ds__extract_year
+ , subq_0.booking__ds__extract_quarter
+ , subq_0.booking__ds__extract_month
+ , subq_0.booking__ds__extract_day
+ , subq_0.booking__ds__extract_dow
+ , subq_0.booking__ds__extract_doy
+ , subq_0.booking__ds_partitioned__day
+ , subq_0.booking__ds_partitioned__week
+ , subq_0.booking__ds_partitioned__month
+ , subq_0.booking__ds_partitioned__quarter
+ , subq_0.booking__ds_partitioned__year
+ , subq_0.booking__ds_partitioned__extract_year
+ , subq_0.booking__ds_partitioned__extract_quarter
+ , subq_0.booking__ds_partitioned__extract_month
+ , subq_0.booking__ds_partitioned__extract_day
+ , subq_0.booking__ds_partitioned__extract_dow
+ , subq_0.booking__ds_partitioned__extract_doy
+ , subq_0.booking__paid_at__day
+ , subq_0.booking__paid_at__week
+ , subq_0.booking__paid_at__month
+ , subq_0.booking__paid_at__quarter
+ , subq_0.booking__paid_at__year
+ , subq_0.booking__paid_at__extract_year
+ , subq_0.booking__paid_at__extract_quarter
+ , subq_0.booking__paid_at__extract_month
+ , subq_0.booking__paid_at__extract_day
+ , subq_0.booking__paid_at__extract_dow
+ , subq_0.booking__paid_at__extract_doy
+ , subq_0.ds__day AS metric_time__day
+ , subq_0.ds__week AS metric_time__week
+ , subq_0.ds__month AS metric_time__month
+ , subq_0.ds__quarter AS metric_time__quarter
+ , subq_0.ds__year AS metric_time__year
+ , subq_0.ds__extract_year AS metric_time__extract_year
+ , subq_0.ds__extract_quarter AS metric_time__extract_quarter
+ , subq_0.ds__extract_month AS metric_time__extract_month
+ , subq_0.ds__extract_day AS metric_time__extract_day
+ , subq_0.ds__extract_dow AS metric_time__extract_dow
+ , subq_0.ds__extract_doy AS metric_time__extract_doy
+ , subq_0.listing
+ , subq_0.guest
+ , subq_0.host
+ , subq_0.booking__listing
+ , subq_0.booking__guest
+ , subq_0.booking__host
+ , subq_0.is_instant
+ , subq_0.booking__is_instant
+ , subq_0.bookings
+ , subq_0.instant_bookings
+ , subq_0.booking_value
+ , subq_0.max_booking_value
+ , subq_0.min_booking_value
+ , subq_0.bookers
+ , subq_0.average_booking_value
+ , subq_0.referred_bookings
+ , subq_0.median_booking_value
+ , subq_0.booking_value_p99
+ , subq_0.discrete_booking_value_p99
+ , subq_0.approximate_continuous_booking_value_p99
+ , subq_0.approximate_discrete_booking_value_p99
+ FROM (
+ -- Read Elements From Semantic Model 'bookings_source'
+ SELECT
+ 1 AS bookings
+ , CASE WHEN is_instant THEN 1 ELSE 0 END AS instant_bookings
+ , bookings_source_src_28000.booking_value
+ , bookings_source_src_28000.booking_value AS max_booking_value
+ , bookings_source_src_28000.booking_value AS min_booking_value
+ , bookings_source_src_28000.guest_id AS bookers
+ , bookings_source_src_28000.booking_value AS average_booking_value
+ , bookings_source_src_28000.booking_value AS booking_payments
+ , CASE WHEN referrer_id IS NOT NULL THEN 1 ELSE 0 END AS referred_bookings
+ , bookings_source_src_28000.booking_value AS median_booking_value
+ , bookings_source_src_28000.booking_value AS booking_value_p99
+ , bookings_source_src_28000.booking_value AS discrete_booking_value_p99
+ , bookings_source_src_28000.booking_value AS approximate_continuous_booking_value_p99
+ , bookings_source_src_28000.booking_value AS approximate_discrete_booking_value_p99
+ , bookings_source_src_28000.is_instant
+ , DATE_TRUNC('day', bookings_source_src_28000.ds) AS ds__day
+ , DATE_TRUNC('week', bookings_source_src_28000.ds) AS ds__week
+ , DATE_TRUNC('month', bookings_source_src_28000.ds) AS ds__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.ds) AS ds__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.ds) AS ds__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds) AS ds__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds) AS ds__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds) AS ds__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds) AS ds__extract_day
+ , EXTRACT(DAY_OF_WEEK FROM bookings_source_src_28000.ds) AS ds__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.ds) AS ds__extract_doy
+ , DATE_TRUNC('day', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__day
+ , DATE_TRUNC('week', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__week
+ , DATE_TRUNC('month', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_day
+ , EXTRACT(DAY_OF_WEEK FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_doy
+ , DATE_TRUNC('day', bookings_source_src_28000.paid_at) AS paid_at__day
+ , DATE_TRUNC('week', bookings_source_src_28000.paid_at) AS paid_at__week
+ , DATE_TRUNC('month', bookings_source_src_28000.paid_at) AS paid_at__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.paid_at) AS paid_at__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.paid_at) AS paid_at__year
+ , EXTRACT(year FROM bookings_source_src_28000.paid_at) AS paid_at__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.paid_at) AS paid_at__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.paid_at) AS paid_at__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.paid_at) AS paid_at__extract_day
+ , EXTRACT(DAY_OF_WEEK FROM bookings_source_src_28000.paid_at) AS paid_at__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.paid_at) AS paid_at__extract_doy
+ , bookings_source_src_28000.is_instant AS booking__is_instant
+ , DATE_TRUNC('day', bookings_source_src_28000.ds) AS booking__ds__day
+ , DATE_TRUNC('week', bookings_source_src_28000.ds) AS booking__ds__week
+ , DATE_TRUNC('month', bookings_source_src_28000.ds) AS booking__ds__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.ds) AS booking__ds__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.ds) AS booking__ds__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds) AS booking__ds__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds) AS booking__ds__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds) AS booking__ds__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds) AS booking__ds__extract_day
+ , EXTRACT(DAY_OF_WEEK FROM bookings_source_src_28000.ds) AS booking__ds__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.ds) AS booking__ds__extract_doy
+ , DATE_TRUNC('day', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__day
+ , DATE_TRUNC('week', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__week
+ , DATE_TRUNC('month', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_day
+ , EXTRACT(DAY_OF_WEEK FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_doy
+ , DATE_TRUNC('day', bookings_source_src_28000.paid_at) AS booking__paid_at__day
+ , DATE_TRUNC('week', bookings_source_src_28000.paid_at) AS booking__paid_at__week
+ , DATE_TRUNC('month', bookings_source_src_28000.paid_at) AS booking__paid_at__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.paid_at) AS booking__paid_at__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.paid_at) AS booking__paid_at__year
+ , EXTRACT(year FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_day
+ , EXTRACT(DAY_OF_WEEK FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_doy
+ , bookings_source_src_28000.listing_id AS listing
+ , bookings_source_src_28000.guest_id AS guest
+ , bookings_source_src_28000.host_id AS host
+ , bookings_source_src_28000.listing_id AS booking__listing
+ , bookings_source_src_28000.guest_id AS booking__guest
+ , bookings_source_src_28000.host_id AS booking__host
+ FROM ***************************.fct_bookings bookings_source_src_28000
+ ) subq_0
+ ) subq_1
+ ) subq_2
+ GROUP BY
+ subq_2.booking__is_instant
+ ) subq_3
+ ) subq_4
+ ) subq_5
+ FULL OUTER JOIN (
+ -- Compute Metrics via Expressions
+ SELECT
+ subq_10.booking__is_instant
+ , shared_alias + 10 AS derived_shared_alias_2
+ FROM (
+ -- Compute Metrics via Expressions
+ SELECT
+ subq_9.booking__is_instant
+ , subq_9.instant_bookings AS shared_alias
+ FROM (
+ -- Aggregate Measures
+ SELECT
+ subq_8.booking__is_instant
+ , SUM(subq_8.instant_bookings) AS instant_bookings
+ FROM (
+ -- Pass Only Elements: ['instant_bookings', 'booking__is_instant']
+ SELECT
+ subq_7.booking__is_instant
+ , subq_7.instant_bookings
+ FROM (
+ -- Metric Time Dimension 'ds'
+ SELECT
+ subq_6.ds__day
+ , subq_6.ds__week
+ , subq_6.ds__month
+ , subq_6.ds__quarter
+ , subq_6.ds__year
+ , subq_6.ds__extract_year
+ , subq_6.ds__extract_quarter
+ , subq_6.ds__extract_month
+ , subq_6.ds__extract_day
+ , subq_6.ds__extract_dow
+ , subq_6.ds__extract_doy
+ , subq_6.ds_partitioned__day
+ , subq_6.ds_partitioned__week
+ , subq_6.ds_partitioned__month
+ , subq_6.ds_partitioned__quarter
+ , subq_6.ds_partitioned__year
+ , subq_6.ds_partitioned__extract_year
+ , subq_6.ds_partitioned__extract_quarter
+ , subq_6.ds_partitioned__extract_month
+ , subq_6.ds_partitioned__extract_day
+ , subq_6.ds_partitioned__extract_dow
+ , subq_6.ds_partitioned__extract_doy
+ , subq_6.paid_at__day
+ , subq_6.paid_at__week
+ , subq_6.paid_at__month
+ , subq_6.paid_at__quarter
+ , subq_6.paid_at__year
+ , subq_6.paid_at__extract_year
+ , subq_6.paid_at__extract_quarter
+ , subq_6.paid_at__extract_month
+ , subq_6.paid_at__extract_day
+ , subq_6.paid_at__extract_dow
+ , subq_6.paid_at__extract_doy
+ , subq_6.booking__ds__day
+ , subq_6.booking__ds__week
+ , subq_6.booking__ds__month
+ , subq_6.booking__ds__quarter
+ , subq_6.booking__ds__year
+ , subq_6.booking__ds__extract_year
+ , subq_6.booking__ds__extract_quarter
+ , subq_6.booking__ds__extract_month
+ , subq_6.booking__ds__extract_day
+ , subq_6.booking__ds__extract_dow
+ , subq_6.booking__ds__extract_doy
+ , subq_6.booking__ds_partitioned__day
+ , subq_6.booking__ds_partitioned__week
+ , subq_6.booking__ds_partitioned__month
+ , subq_6.booking__ds_partitioned__quarter
+ , subq_6.booking__ds_partitioned__year
+ , subq_6.booking__ds_partitioned__extract_year
+ , subq_6.booking__ds_partitioned__extract_quarter
+ , subq_6.booking__ds_partitioned__extract_month
+ , subq_6.booking__ds_partitioned__extract_day
+ , subq_6.booking__ds_partitioned__extract_dow
+ , subq_6.booking__ds_partitioned__extract_doy
+ , subq_6.booking__paid_at__day
+ , subq_6.booking__paid_at__week
+ , subq_6.booking__paid_at__month
+ , subq_6.booking__paid_at__quarter
+ , subq_6.booking__paid_at__year
+ , subq_6.booking__paid_at__extract_year
+ , subq_6.booking__paid_at__extract_quarter
+ , subq_6.booking__paid_at__extract_month
+ , subq_6.booking__paid_at__extract_day
+ , subq_6.booking__paid_at__extract_dow
+ , subq_6.booking__paid_at__extract_doy
+ , subq_6.ds__day AS metric_time__day
+ , subq_6.ds__week AS metric_time__week
+ , subq_6.ds__month AS metric_time__month
+ , subq_6.ds__quarter AS metric_time__quarter
+ , subq_6.ds__year AS metric_time__year
+ , subq_6.ds__extract_year AS metric_time__extract_year
+ , subq_6.ds__extract_quarter AS metric_time__extract_quarter
+ , subq_6.ds__extract_month AS metric_time__extract_month
+ , subq_6.ds__extract_day AS metric_time__extract_day
+ , subq_6.ds__extract_dow AS metric_time__extract_dow
+ , subq_6.ds__extract_doy AS metric_time__extract_doy
+ , subq_6.listing
+ , subq_6.guest
+ , subq_6.host
+ , subq_6.booking__listing
+ , subq_6.booking__guest
+ , subq_6.booking__host
+ , subq_6.is_instant
+ , subq_6.booking__is_instant
+ , subq_6.bookings
+ , subq_6.instant_bookings
+ , subq_6.booking_value
+ , subq_6.max_booking_value
+ , subq_6.min_booking_value
+ , subq_6.bookers
+ , subq_6.average_booking_value
+ , subq_6.referred_bookings
+ , subq_6.median_booking_value
+ , subq_6.booking_value_p99
+ , subq_6.discrete_booking_value_p99
+ , subq_6.approximate_continuous_booking_value_p99
+ , subq_6.approximate_discrete_booking_value_p99
+ FROM (
+ -- Read Elements From Semantic Model 'bookings_source'
+ SELECT
+ 1 AS bookings
+ , CASE WHEN is_instant THEN 1 ELSE 0 END AS instant_bookings
+ , bookings_source_src_28000.booking_value
+ , bookings_source_src_28000.booking_value AS max_booking_value
+ , bookings_source_src_28000.booking_value AS min_booking_value
+ , bookings_source_src_28000.guest_id AS bookers
+ , bookings_source_src_28000.booking_value AS average_booking_value
+ , bookings_source_src_28000.booking_value AS booking_payments
+ , CASE WHEN referrer_id IS NOT NULL THEN 1 ELSE 0 END AS referred_bookings
+ , bookings_source_src_28000.booking_value AS median_booking_value
+ , bookings_source_src_28000.booking_value AS booking_value_p99
+ , bookings_source_src_28000.booking_value AS discrete_booking_value_p99
+ , bookings_source_src_28000.booking_value AS approximate_continuous_booking_value_p99
+ , bookings_source_src_28000.booking_value AS approximate_discrete_booking_value_p99
+ , bookings_source_src_28000.is_instant
+ , DATE_TRUNC('day', bookings_source_src_28000.ds) AS ds__day
+ , DATE_TRUNC('week', bookings_source_src_28000.ds) AS ds__week
+ , DATE_TRUNC('month', bookings_source_src_28000.ds) AS ds__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.ds) AS ds__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.ds) AS ds__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds) AS ds__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds) AS ds__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds) AS ds__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds) AS ds__extract_day
+ , EXTRACT(DAY_OF_WEEK FROM bookings_source_src_28000.ds) AS ds__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.ds) AS ds__extract_doy
+ , DATE_TRUNC('day', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__day
+ , DATE_TRUNC('week', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__week
+ , DATE_TRUNC('month', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.ds_partitioned) AS ds_partitioned__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_day
+ , EXTRACT(DAY_OF_WEEK FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.ds_partitioned) AS ds_partitioned__extract_doy
+ , DATE_TRUNC('day', bookings_source_src_28000.paid_at) AS paid_at__day
+ , DATE_TRUNC('week', bookings_source_src_28000.paid_at) AS paid_at__week
+ , DATE_TRUNC('month', bookings_source_src_28000.paid_at) AS paid_at__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.paid_at) AS paid_at__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.paid_at) AS paid_at__year
+ , EXTRACT(year FROM bookings_source_src_28000.paid_at) AS paid_at__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.paid_at) AS paid_at__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.paid_at) AS paid_at__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.paid_at) AS paid_at__extract_day
+ , EXTRACT(DAY_OF_WEEK FROM bookings_source_src_28000.paid_at) AS paid_at__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.paid_at) AS paid_at__extract_doy
+ , bookings_source_src_28000.is_instant AS booking__is_instant
+ , DATE_TRUNC('day', bookings_source_src_28000.ds) AS booking__ds__day
+ , DATE_TRUNC('week', bookings_source_src_28000.ds) AS booking__ds__week
+ , DATE_TRUNC('month', bookings_source_src_28000.ds) AS booking__ds__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.ds) AS booking__ds__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.ds) AS booking__ds__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds) AS booking__ds__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds) AS booking__ds__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds) AS booking__ds__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds) AS booking__ds__extract_day
+ , EXTRACT(DAY_OF_WEEK FROM bookings_source_src_28000.ds) AS booking__ds__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.ds) AS booking__ds__extract_doy
+ , DATE_TRUNC('day', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__day
+ , DATE_TRUNC('week', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__week
+ , DATE_TRUNC('month', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__year
+ , EXTRACT(year FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_day
+ , EXTRACT(DAY_OF_WEEK FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.ds_partitioned) AS booking__ds_partitioned__extract_doy
+ , DATE_TRUNC('day', bookings_source_src_28000.paid_at) AS booking__paid_at__day
+ , DATE_TRUNC('week', bookings_source_src_28000.paid_at) AS booking__paid_at__week
+ , DATE_TRUNC('month', bookings_source_src_28000.paid_at) AS booking__paid_at__month
+ , DATE_TRUNC('quarter', bookings_source_src_28000.paid_at) AS booking__paid_at__quarter
+ , DATE_TRUNC('year', bookings_source_src_28000.paid_at) AS booking__paid_at__year
+ , EXTRACT(year FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_year
+ , EXTRACT(quarter FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_quarter
+ , EXTRACT(month FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_month
+ , EXTRACT(day FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_day
+ , EXTRACT(DAY_OF_WEEK FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_dow
+ , EXTRACT(doy FROM bookings_source_src_28000.paid_at) AS booking__paid_at__extract_doy
+ , bookings_source_src_28000.listing_id AS listing
+ , bookings_source_src_28000.guest_id AS guest
+ , bookings_source_src_28000.host_id AS host
+ , bookings_source_src_28000.listing_id AS booking__listing
+ , bookings_source_src_28000.guest_id AS booking__guest
+ , bookings_source_src_28000.host_id AS booking__host
+ FROM ***************************.fct_bookings bookings_source_src_28000
+ ) subq_6
+ ) subq_7
+ ) subq_8
+ GROUP BY
+ subq_8.booking__is_instant
+ ) subq_9
+ ) subq_10
+ ) subq_11
+ ON
+ subq_5.booking__is_instant = subq_11.booking__is_instant
+ GROUP BY
+ COALESCE(subq_5.booking__is_instant, subq_11.booking__is_instant)
+) subq_12
+LIMIT 1
diff --git a/tests_metricflow/snapshots/test_derived_metric_rendering.py/SqlQueryPlan/Trino/test_derived_metric_that_defines_the_same_alias_in_different_components__plan0_optimized.sql b/tests_metricflow/snapshots/test_derived_metric_rendering.py/SqlQueryPlan/Trino/test_derived_metric_that_defines_the_same_alias_in_different_components__plan0_optimized.sql
new file mode 100644
index 0000000000..6b1c46eee3
--- /dev/null
+++ b/tests_metricflow/snapshots/test_derived_metric_rendering.py/SqlQueryPlan/Trino/test_derived_metric_that_defines_the_same_alias_in_different_components__plan0_optimized.sql
@@ -0,0 +1,59 @@
+-- Combine Aggregated Outputs
+-- Order By [] Limit 1
+SELECT
+ COALESCE(subq_18.booking__is_instant, subq_24.booking__is_instant) AS booking__is_instant
+ , MAX(subq_18.derived_shared_alias_1a) AS derived_shared_alias_1a
+ , MAX(subq_24.derived_shared_alias_2) AS derived_shared_alias_2
+FROM (
+ -- Compute Metrics via Expressions
+ SELECT
+ booking__is_instant
+ , shared_alias - 10 AS derived_shared_alias_1a
+ FROM (
+ -- Aggregate Measures
+ -- Compute Metrics via Expressions
+ SELECT
+ booking__is_instant
+ , SUM(bookings) AS shared_alias
+ FROM (
+ -- Read Elements From Semantic Model 'bookings_source'
+ -- Metric Time Dimension 'ds'
+ -- Pass Only Elements: ['bookings', 'booking__is_instant']
+ SELECT
+ is_instant AS booking__is_instant
+ , 1 AS bookings
+ FROM ***************************.fct_bookings bookings_source_src_28000
+ ) subq_15
+ GROUP BY
+ booking__is_instant
+ ) subq_17
+) subq_18
+FULL OUTER JOIN (
+ -- Compute Metrics via Expressions
+ SELECT
+ booking__is_instant
+ , shared_alias + 10 AS derived_shared_alias_2
+ FROM (
+ -- Aggregate Measures
+ -- Compute Metrics via Expressions
+ SELECT
+ booking__is_instant
+ , SUM(instant_bookings) AS shared_alias
+ FROM (
+ -- Read Elements From Semantic Model 'bookings_source'
+ -- Metric Time Dimension 'ds'
+ -- Pass Only Elements: ['instant_bookings', 'booking__is_instant']
+ SELECT
+ is_instant AS booking__is_instant
+ , CASE WHEN is_instant THEN 1 ELSE 0 END AS instant_bookings
+ FROM ***************************.fct_bookings bookings_source_src_28000
+ ) subq_21
+ GROUP BY
+ booking__is_instant
+ ) subq_23
+) subq_24
+ON
+ subq_18.booking__is_instant = subq_24.booking__is_instant
+GROUP BY
+ COALESCE(subq_18.booking__is_instant, subq_24.booking__is_instant)
+LIMIT 1
diff --git a/tests_metricflow/snapshots/test_source_scan_optimizer.py/DataflowPlan/test_derived_metric_same_alias_components_combined__dfp_0.xml b/tests_metricflow/snapshots/test_source_scan_optimizer.py/DataflowPlan/test_derived_metric_same_alias_components_combined__dfp_0.xml
new file mode 100644
index 0000000000..145af4b7bc
--- /dev/null
+++ b/tests_metricflow/snapshots/test_source_scan_optimizer.py/DataflowPlan/test_derived_metric_same_alias_components_combined__dfp_0.xml
@@ -0,0 +1,84 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests_metricflow/snapshots/test_source_scan_optimizer.py/DataflowPlan/test_derived_metric_same_alias_components_combined__dfpo_0.xml b/tests_metricflow/snapshots/test_source_scan_optimizer.py/DataflowPlan/test_derived_metric_same_alias_components_combined__dfpo_0.xml
new file mode 100644
index 0000000000..fff218b335
--- /dev/null
+++ b/tests_metricflow/snapshots/test_source_scan_optimizer.py/DataflowPlan/test_derived_metric_same_alias_components_combined__dfpo_0.xml
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests_metricflow/snapshots/test_source_scan_optimizer.py/DataflowPlan/test_derived_metric_same_alias_components_not_combined__dfp_0.xml b/tests_metricflow/snapshots/test_source_scan_optimizer.py/DataflowPlan/test_derived_metric_same_alias_components_not_combined__dfp_0.xml
new file mode 100644
index 0000000000..d1d12ee4c6
--- /dev/null
+++ b/tests_metricflow/snapshots/test_source_scan_optimizer.py/DataflowPlan/test_derived_metric_same_alias_components_not_combined__dfp_0.xml
@@ -0,0 +1,88 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests_metricflow/snapshots/test_source_scan_optimizer.py/DataflowPlan/test_derived_metric_same_alias_components_not_combined__dfpo_0.xml b/tests_metricflow/snapshots/test_source_scan_optimizer.py/DataflowPlan/test_derived_metric_same_alias_components_not_combined__dfpo_0.xml
new file mode 100644
index 0000000000..2926cc46c9
--- /dev/null
+++ b/tests_metricflow/snapshots/test_source_scan_optimizer.py/DataflowPlan/test_derived_metric_same_alias_components_not_combined__dfpo_0.xml
@@ -0,0 +1,88 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+