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