Существуют задачи, когда нужно определить некоторые суммарные показатели
за промежуток времени, однако стартовое время - четко не задано или произвольно.
К примеру, 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;
SQL Справочник v0.05 © 2007-2025 Igor Salnikov aka SunDoctor