Как рассчитать сумму столбца при наличии условия в SQLite Swift? - PullRequest
0 голосов
/ 23 ноября 2018

Я хочу использовать SQLite3 Swift, чтобы сделать вычисление, которое накапливает значения, когда флаг равен 0, и вычитает их из накопленного значения, когда оно равно 1.

Я также хочу получить среднее значениекумулятивные значения, только если Флаг равен 0, и я хочу получить предыдущее среднее значение, если оно равно 1.

Я прикрепил изображение.

enter image description here

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Если вы используете Sqlite 3.25 или выше, оконные функции упрощают получение результатов RsSum.Мне потребовалось некоторое время, чтобы выяснить, как вычисляются числа RsAvg, но я также смог получить эти значения:

CREATE TABLE input(no INTEGER PRIMARY KEY, flag INTEGER, amt NUMERIC);
INSERT INTO input(no, flag, amt)
VALUES (1, 0, 10), (2, 0, 20), (3, 0, 30), (4, 1, 10), (5, 0, 10), (6, 0, 20)
     , (7, 1, 30);

WITH
  sumcte AS (
   SELECT no, flag
        , sum(CASE WHEN flag = 0 THEN amt ELSE -amt END) OVER (ORDER BY no) AS RsSum
   FROM input)
, avgcte AS (
   SELECT no, flag, RsSum
        , cast(RsSum AS REAL) / count(no) FILTER (WHERE flag = 0)
                                          OVER (ORDER BY no) As RsAvg
   FROM sumcte)
SELECT RsSum
     , (CASE WHEN flag = 0 THEN RsAvg
             ELSE lag(RsAvg, 1) OVER (ORDER BY no) END) As RsAvg
FROM avgcte ORDER BY no;

производит

RsSum       RsAvg     
----------  ----------
10          10.0
30          15.0
60          20.0
50          20.0
60          15.0
80          16.0
50          16.0

(Интерпретация RsAvg так как RsSum этой строки, деленное на количество увиденных до сих пор строк, где flag равно 0, это единственный способ, с помощью которого я могу заставить числа работать.)

Это сломается, когда две строки в строке имеютflag из 1, хотя.Я обновлю еще раз, если найду обходной путь для этого случая.

0 голосов
/ 23 ноября 2018

Вы можете фильтровать объекты по условию (флаг == 0), используя некоторые NSPredicate функции.

Затем вы можете добавить значения последовательности (sum1), используя функцию reduce(_:_:).

Теперь, когда у вас есть sum1, вы можете аналогичным образом отфильтровать (flag == 1) сущности.

Снова использовать функцию Reduction для последовательности, чтобы получить их sum2.Вычтите сумму 2 из sum.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...