Вы хотите получить одну строку на пользователя с итоговой выручкой и заменили GROUP BY на оконную SUM(amount) OVER (PARTITION BY user_id). Почему результат содержит столько же строк, сколько и исходный набор?
AОконная агрегация подставляет итог в каждую строку секции и не меняет гранулярность, в отличие от
GROUP BYB
PARTITION BY сортирует строки и поэтому результат не схлопывается до одной строки на пользователяCКонструкция
SUM(amount) OVER (...) не поддерживается в большинстве СУБД и работает только с явным GROUP BYDОконная функция считает только последний платёж пользователя, а остальные строки сохраняет как есть
Правильный ответ. Оконные функции не меняют гранулярность результата, в отличие от
GROUP BY.Разбор
SUM(amount) OVER (PARTITION BY user_id) вычисляет итог по пользователю, но возвращает этот итог в каждой исходной строке. Это удобно для долей и сравнения строки с итогом по группе. GROUP BY user_id схлопывает строки и действительно даёт одну строку на пользователя. Поэтому оконная агрегация не является заменой GROUP BY, если цель — уменьшить количество строк в результате.
Проверь себя · 1/3разбор после ответа
Для каждой покупки пользователя нужно добавить дату следующей покупки этого же пользователя, чтобы потом посчитать интервал между покупками. Что использовать?
Ещё вопросы по теме «Оконные функции»
- В одной категории 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-й заказ. Какое выражение подходит?
- Все вопросы по «Оконные функции» →