Вы написали SUM(amount) OVER (ORDER BY paid_at) и ожидали накопительную сумму по каждому пользователю, но сумма растет сквозь всех пользователей. Что нужно добавить в OVER, чтобы накопление считалось отдельно по каждому пользователю?
AДобавить
PARTITION BY user_idBУбрать
ORDER BY paid_atCДобавить
GROUP BY user_idDЗаменить
SUM на RANKПравильный ответ.
PARTITION BY разделяет расчет окна на независимые группы.Разбор
Без PARTITION BY окно одно на весь набор строк, поэтому кумулятивная сумма считается глобально. Добавив PARTITION BY user_id, вы получите независимую кумулятивную сумму внутри каждого пользователя, а ORDER BY paid_at задаст порядок накопления по времени.
Проверь себя · 1/3разбор после ответа
Вы написали
SUM(amount) OVER (ORDER BY paid_at) и ожидали накопительную сумму по каждому пользователю, но сумма растет сквозь всех пользователей. Что нужно добавить в OVER, чтобы накопление считалось отдельно по каждому пользователю?Ещё вопросы по теме «Оконные функции»
- В одной категории 4 товара с выручкой 100, 100, 90 и 80. Вычисляем `RANK() OVER (ORDER BY revenue DESC)`. Какие ранги будут у строк, если упорядочить товары по убыванию выручки?
- Вы ищете последнюю транзакцию пользователя, используя `ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY paid_at DESC)` и оставляя `row_number = 1`. Что верно, если у пользователя две транзакции с одинаковым `paid_at`?
- Вы делаете рейтинг товаров по выручке внутри категории. Если два товара делят 2 место, следующий товар должен получить 3 место (без пропуска). Какая функция подходит лучше всего?
- В каждой категории нужно выбрать товары с тремя наибольшими различными значениями `revenue`, включая все товары, которые делят эти значения (при равных значениях). Какой вариант даст нужный результат?
- Нужно пронумеровать заказы каждого пользователя по времени покупки, начиная с 1, чтобы потом найти 1-й, 2-й, 3-й заказ. Какое выражение подходит?
- Все вопросы по «Оконные функции» →