@@ -2844,6 +2844,15 @@ def _normalize_expr_for_subquery(sql_expr: str, table_alias: str, qualify_bare:
28442844 # ts_sql for from_clause_s subquery (SQL models aliased as "_src", table models no alias)
28452845 ts_sql_src = _normalize_expr_for_subquery (ts_sql_raw , "_src" if model .sql else "" )
28462846
2847+ # Resolve entity: use dimension sql_expr if available (handles aliased dims
2848+ # and qualified names like events.user_id -> user_id)
2849+ entity_dim = model .get_dimension (metric .entity )
2850+ entity_sql_raw = entity_dim .sql_expr if entity_dim else metric .entity
2851+ # Normalize for step 1 context (alias "t" for SQL models, bare for table models)
2852+ entity_sql = _normalize_expr_for_subquery (entity_sql_raw , "t" if model .sql else "" )
2853+ # Normalize for step N context (always alias "s")
2854+ entity_sql_s = _normalize_expr_for_subquery (entity_sql_raw , "s" )
2855+
28472856 # Normalize filters: strip model name prefixes so they work inside CTEs
28482857 normalized_filters = self ._strip_model_prefixes (filters or [], model .name )
28492858
@@ -2898,11 +2907,11 @@ def _normalize_expr_for_subquery(sql_expr: str, table_alias: str, qualify_bare:
28982907 norm_step = _normalize_expr_for_subquery (step_expr , "t" if model .sql else "" )
28992908
29002909 # Step 1: find the earliest matching event per entity
2901- select_parts = [f"{ metric . entity } AS entity" , f"MIN({ ts_sql } ) AS step_1_ts" ]
2910+ select_parts = [f"{ entity_sql } AS entity" , f"MIN({ ts_sql } ) AS step_1_ts" ]
29022911 for alias , sql_col in dim_entries :
29032912 select_parts .append (f"{ sql_col } AS { alias } " )
29042913 select_str = ",\n " .join (select_parts )
2905- group_parts = [metric . entity ]
2914+ group_parts = [entity_sql ]
29062915 for _alias , sql_col in dim_entries :
29072916 group_parts .append (sql_col )
29082917 group_str = ",\n " .join (group_parts )
@@ -2924,11 +2933,11 @@ def _normalize_expr_for_subquery(sql_expr: str, table_alias: str, qualify_bare:
29242933
29252934 # Step N: join source to step N-1, only consider events at or after prior step
29262935 prev = f"step_{ i - 1 } "
2927- select_parts = [f"s. { metric . entity } AS entity" , f"MIN(s.__ts) AS step_{ i } _ts" ]
2936+ select_parts = [f"{ entity_sql_s } AS entity" , f"MIN(s.__ts) AS step_{ i } _ts" ]
29282937 for alias , _sql_col in dim_entries :
29292938 select_parts .append (f"{ prev } .{ alias } " )
29302939 select_str = ",\n " .join (select_parts )
2931- group_parts = [f"s. { metric . entity } " ]
2940+ group_parts = [entity_sql_s ]
29322941 for alias , _sql_col in dim_entries :
29332942 group_parts .append (f"{ prev } .{ alias } " )
29342943 group_str = ",\n " .join (group_parts )
@@ -2937,7 +2946,7 @@ def _normalize_expr_for_subquery(sql_expr: str, table_alias: str, qualify_bare:
29372946 f" SELECT\n "
29382947 f" { select_str } \n "
29392948 f" FROM { from_clause_s } \n "
2940- f" JOIN { prev } ON s. { metric . entity } = { prev } .entity\n "
2949+ f" JOIN { prev } ON { entity_sql_s } = { prev } .entity\n "
29412950 f" AND s.__ts >= { prev } .step_{ i - 1 } _ts\n "
29422951 f" WHERE ({ norm_step } ){ filter_clause_s } \n "
29432952 f" GROUP BY\n "
0 commit comments