diff --git a/homeassistant/components/recorder/statistics.py b/homeassistant/components/recorder/statistics.py index 584217ed035..1818e07aa2e 100644 --- a/homeassistant/components/recorder/statistics.py +++ b/homeassistant/components/recorder/statistics.py @@ -1976,6 +1976,24 @@ def get_latest_short_term_statistics( ) +def _get_most_recent_statistics_subquery( + metadata_ids: set[int], table: type[StatisticsBase], start_time_ts: float +) -> Subquery: + """Generate the subquery to find the most recent statistic row.""" + return ( + select( + # https://github.com/sqlalchemy/sqlalchemy/issues/9189 + # pylint: disable-next=not-callable + func.max(table.start_ts).label("max_start_ts"), + table.metadata_id.label("max_metadata_id"), + ) + .filter(table.start_ts < start_time_ts) + .filter(table.metadata_id.in_(metadata_ids)) + .group_by(table.metadata_id) + .subquery() + ) + + def _statistics_at_time( session: Session, metadata_ids: set[int], @@ -1999,24 +2017,10 @@ def _statistics_at_time( columns = columns.add_columns(table.sum) start_time_ts = start_time.timestamp() - stmt = lambda_stmt(lambda: columns) - - most_recent_statistic_ids = ( - lambda_stmt( - lambda: select( - # https://github.com/sqlalchemy/sqlalchemy/issues/9189 - # pylint: disable-next=not-callable - func.max(table.start_ts).label("max_start_ts"), - table.metadata_id.label("max_metadata_id"), - ) - ) - .filter(table.start_ts < start_time_ts) - .filter(table.metadata_id.in_(metadata_ids)) - .group_by(table.metadata_id) - .subquery() + most_recent_statistic_ids = _get_most_recent_statistics_subquery( + metadata_ids, table, start_time_ts ) - - stmt += lambda q: q.join( + stmt = lambda_stmt(lambda: columns).join( most_recent_statistic_ids, table.start_ts == most_recent_statistic_ids.c.max_start_ts and table.metadata_id == most_recent_statistic_ids.c.max_metadata_id,