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