Выбор ответа Senior Оконные функции обновлено

Нарастающий итог при одинаковых датах

Вопрос

В таблице три платежа: 1 марта на 100, 2 марта на 50 и ещё 2 марта на 30. Что будет в running у двух мартовских платежей от 2 числа?

SELECT paid_at, amount,
       SUM(amount) OVER (ORDER BY paid_at) AS running
FROM payments;

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: 180 и 180. Если в OVER есть ORDER BY, рамка по умолчанию RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW, а RANGE включает все строки, равные текущей по ключу сортировки (peers).

Варианты ответа

  1. 150 и 180
  2. 130 и 180
  3. 180 и 180правильный ответ
  4. 50 и 30

Разбор

Если в OVER есть ORDER BY, рамка по умолчанию RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW, а RANGE включает все строки, равные текущей по ключу сортировки (peers). Обе строки за 2 марта видят 100 + 50 + 30 = 180. Построчный итог (150 и 180 в зависимости от порядка) дала бы рамка ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW с однозначной сортировкой. «50 и 30» было бы без накопления.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме