Если вы используете современную версию sqlite (3.25 или новее), вы можете использовать оконные функции:
SELECT cumulativeSales, place
FROM (SELECT id, place, profit
, sum(sales) OVER (ORDER BY id) AS cumulativeSales
FROM yourtable)
WHERE profit = 1
ORDER BY id;
дает
cumulativeSales place
--------------- ----------
2 US
6 India
12 UK
Форма оконной функции: sum()
(обозначено следующим предложением OVER
), используемое во внутреннем запросе, суммирует заданное окно строк результата.Поведение по умолчанию с использованием только ORDER BY
(без явного термина кадрирования) - использовать первую строку до всех строк с одинаковым значением, по которому производится сортировка, но не более того.Другими словами, он рассчитывает совокупную сумму.Подробнее см. документацию .
Внешний запрос ограничивает результаты только теми строками, где profit
равно 1. Если вы сделали все это в одном без подзапроса, онбудет рассчитывать только совокупную сумму этих строк, а не всех строк, потому что оконные функции вычисляются после выполнения фильтрации WHERE
.
Другой подход, использующий коррелированный подзапрос для вычисления выполняющейсяВсего, что работает на старых версиях без поддержки оконной функции:
SELECT (SELECT sum(sales) FROM yourtable AS t2 WHERE t2.id <= t.id) AS cumulativeSales
, place
FROM yourtable AS t
WHERE profit = 1
ORDER BY id;