SQLite: скользящее и сгруппированное множество


Существуют задачи, когда нужно определить некоторые суммарные показатели
за промежуток времени, однако стартовое время - четко не задано или произвольно.
К примеру, 18 июня началось предоставление какой-то услуги и нужно помесячно
(начиная с 18 июня) рассчитать бюджет. Очевидно, что это делается группировкой,
однако группировка может быть относительной (плавающей) или привязанной к месяцам
(сгруппированной). Пример ниже:

.headers on
.mode column

CREATE TABLE timevalues (
    id INTEGER PRIMARY KEY,
    f_time integer,
    f_value integer
);

INSERT INTO timevalues(f_time, f_value) VALUES (1, 5);
INSERT INTO timevalues(f_time, f_value) VALUES (3, 5);
INSERT INTO timevalues(f_time, f_value) VALUES (8, 5);
INSERT INTO timevalues(f_time, f_value) VALUES (11, 1);
INSERT INTO timevalues(f_time, f_value) VALUES (13, 1);
INSERT INTO timevalues(f_time, f_value) VALUES (15, 1);
INSERT INTO timevalues(f_time, f_value) VALUES (21, 5);
INSERT INTO timevalues(f_time, f_value) VALUES (29, 5);
INSERT INTO timevalues(f_time, f_value) VALUES (32, 1);
INSERT INTO timevalues(f_time, f_value) VALUES (37, 1);
INSERT INTO timevalues(f_time, f_value) VALUES (38, 1);


-- Скользящее множество
SELECT
   f_time,
   (SELECT sum(f_value) FROM timevalues
    WHERE f_time BETWEEN A.f_time-10 AND A.f_time) as v
FROM timevalues A
GROUP BY 1;

-- Сгруппированное множество
SELECT
   cast(f_time/10 as int) as grpno,
   (SELECT sum(f_value) FROM timevalues
    WHERE cast(f_time/10 as int) = cast(A.f_time/10 as int)) as v
FROM timevalues A
GROUP BY 1;