Как построить сложный оконный запрос (Window Function) средствами SQLAlchemy, не прибегая к сырому SQL?

Используйте SQLAlchemy func и over(), задав partition_by, order_by и при необходимости рамку окна. Для фильтрации по вычисленному номеру строки обычно нужен подзапрос или CTE.

Короткий ответ

Что ответить на собеседовании

Используйте 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.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее