Вы написали SUM(amount) OVER (ORDER BY paid_at) и ожидали накопительную сумму по каждому пользователю, но сумма растёт сквозь всех пользователей. Что нужно добавить в OVER, чтобы накопление считалось отдельно по каждому пользователю?
AДобавить
PARTITION BY user_id, чтобы окно сбрасывалось на границе каждого пользователяBУбрать
ORDER BY paid_at, чтобы сумма перестала накапливаться по времениCДобавить
GROUP BY user_id рядом с оконной функцией для группировкиDЗаменить
SUM на RANK, чтобы получить накопление по позиции строкиПравильный ответ.
PARTITION BY разделяет окно на независимые группы строк.Разбор
Без PARTITION BY окно одно на весь набор строк, поэтому кумулятивная сумма считается глобально. Добавив PARTITION BY user_id, вы получите независимую кумулятивную сумму внутри каждого пользователя, а ORDER BY paid_at задаст порядок накопления по времени. GROUP BY и оконная функция несовместимы в этой логике, а RANK считает позиции строк, а не суммы.
Проверь себя · 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-й заказ. Какое выражение подходит?
- Все вопросы по «Оконные функции» →