Используйте SQLAlchemy func и over(), задав partition_by, order_by и при необходимости рамку окна. Для фильтрации по вычисленному номеру строки обычно нужен подзапрос или CTE.
Как построить сложный оконный запрос (Window Function) средствами SQLAlchemy, не прибегая к сырому SQL?
Используйте SQLAlchemy func и over(), задав partition_by, order_by и при необходимости рамку окна. Для фильтрации по вычисленному номеру строки обычно нужен подзапрос или CTE.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Используйте SQLAlchemy func и over(), задав partition_by, order_by и при необходимости рамку окна. Для фильтрации по вычисленному номеру строки обычно нужен подзапрос или CTE.
Пример выбирает последнюю запись каждого пользователя; Event — уже объявленная модель.
from sqlalchemy import select, func
ranked = select(
Event.id,
Event.user_id,
func.row_number().over(
partition_by=Event.user_id,
order_by=(Event.created_at.desc(), Event.id.desc()),
).label("rn"),
).subquery()
statement = select(ranked.c.id, ranked.c.user_id).where(ranked.c.rn == 1)
Дополнительный id делает выбор детерминированным при одинаковом времени. Для скользящих агрегатов задавайте rows или range_ по смыслу задачи. ORM строит SQL, но стоимость окна и поддержка функций остаются свойствами СУБД.
Источник: docs.sqlalchemy.org.