Вы ищете последнюю транзакцию пользователя, используя ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY paid_at DESC) и оставляя row_number = 1. Что верно, если у пользователя две транзакции с одинаковым paid_at?

AОбе строки получат row_number = 1 за счёт повтора номера при равных значениях paid_at в окне функции
BЗапрос завершится ошибкой выполнения: оконная ROW_NUMBER запрещает совпадения значений paid_at между строками
CОдна строка получит row_number = 1, другая 2, и какая из них окажется первой нестабильно без второго ключа в ORDER BY
DОбе строки будут исключены из результата: условие row_number = 1 для одинаковых paid_at отсекает обе строки разом
Правильный ответ. ROW_NUMBER всегда уникален, но при совпадении значений в сортировке результат может быть нестабильным без дополнительного ключа в ORDER BY.

Разбор

ROW_NUMBER() назначает уникальный номер каждой строке в соответствии с порядком из ORDER BY внутри OVER. Если сортировочный ключ не уникален (совпадение по paid_at), то относительный порядок строк с одинаковым временем не определён, и какая транзакция получит row_number = 1 — может меняться. Чтобы сделать выбор детерминированным, добавляют дополнительный ключ, например ORDER BY paid_at DESC, transaction_id DESC.

Можно заниматься бесплатно

Готовим вопросы…

Три вопроса по теме этой страницы, с объяснениями.

Продолжить в браузере

Ещё вопросы по теме «Оконные функции»