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