SQLite Swift中存在条件时,如何计算列的总和?

时间:2018-11-23 09:21:52

标签: swift sqlite

我想使用SQLite3 Swift进行计算,以在标志为0时累加值,并在值为1时从累加值中减去它们。

我还想仅当Flag为0时才获得累计值的平均值,而当其为1时我想获得先前的平均值。

我附上了图片。

enter image description here

2 个答案:

答案 0 :(得分:0)

您可以使用某些setMainActivity()函数根据条件(标志== 0)过滤实体。

然后,您可以使用NSPredicate函数添加序列(sum1)的值。

现在有了reduce(_:_:),您可以类似地过滤(flag == 1)实体。

再次在序列上使用reduce函数以获得其sum1。从sum2中减去sum2。

答案 1 :(得分:0)

如果您使用的是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时,这将中断。如果找到解决该问题的方法,我将再次更新。