(SQLITE) СУММА на основе совокупного диапазона - PullRequest
0 голосов
/ 25 июня 2019

У меня есть такая таблица:

id | sales |  profit | place
_____________________|______ 
1  |   2   |    1    |  US
2  |   3   |    -    |  SL
3  |   1   |    1    | India
4  |   0   |    -    |  Aus
5  |   2   |    -    |  -
6  |   4   |    1    |  UK
7  |   1   |    -    |  -

Теперь, чего я хочу достичь, там, где profit = 1, я хочу накапливать sales до этой точки в порядке столбца id и соответствующего place т.е. * +1008 *

   |  cumulativeSales | place  |
   | ________________ |_______ |
   |     2            |  US    |      //(2)
   |     6            | India  |      //(2+3+1)
   |     12           |  UK    |      //(2+3+1+0+2+4)

Какой запрос мне написать для этого?

1 Ответ

2 голосов
/ 25 июня 2019

Если вы используете современную версию 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...