Вы ищете последнюю транзакцию пользователя, используя 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 BYDОбе строки будут исключены из результата: условие
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.
Проверь себя · 1/3разбор после ответа
Вы делаете рейтинг товаров по выручке внутри категории. Если два товара делят 2 место, следующий товар должен получить 3 место (без пропуска). Какая функция подходит лучше всего?
Ещё вопросы по теме «Оконные функции»
- В одной категории 4 товара с выручкой 100, 100, 90 и 80. Вычисляем `RANK() OVER (ORDER BY revenue DESC)`. Какие ранги получат строки при сортировке по убыванию выручки?
- Вы делаете рейтинг товаров по выручке внутри категории. Если два товара делят 2 место, следующий товар должен получить 3 место (без пропуска). Какая функция подходит лучше всего?
- В каждой категории нужно выбрать товары с тремя наибольшими различными значениями выручки (`revenue`), включая все товары, которые делят эти значения при равенстве. Какой вариант даст нужный результат?
- Нужно пронумеровать заказы каждого пользователя по времени покупки, начиная с 1, чтобы найти его 1-й, 2-й, 3-й заказ. Какое выражение подходит?
- В таблице платежей для каждой транзакции нужен накопительный итог сумм пользователя на этот момент. Какое выражение даёт корректный результат?
- Все вопросы по «Оконные функции» →