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

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

Разбор

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

Проверь себя · 1/3разбор после ответа
В одной категории 4 товара с выручкой 100, 100, 90 и 80. Вычисляем RANK() OVER (ORDER BY revenue DESC). Какие ранги будут у строк, если упорядочить товары по убыванию выручки?
Тренировать SQL в Telegram

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