Учитывая таблицу со столбцом метки времени, например:
timestamp | id | value
--------------------------------------
2001-01-01 00:00:00 | 1 | 3
2001-01-01 00:00:00 | 2 | 5
--------------------------------------
2001-01-02 00:00:00 | 1 | 6
2001-01-02 00:00:00 | 2 | 10
2001-01-02 00:00:00 | 3 | 7
--------------------------------------
2001-01-03 00:00:00 | 3 | 14
2001-01-03 00:00:00 | 2 | 15
--------------------------------------
2001-01-03 00:00:00 | 1 | 9
2001-01-03 00:00:00 | 2 | 20
и заданный уровень агрегации, скажем 2 дня , я хотел бы агрегировать (суммировать) результаты по:
(1) подвижное окно заданного уровня агг, для приведенного выше примера: с 2001-01-01 по 2001-01-02, с 2001-01-02 по 2001-01-03, 2001-С 01-03 по 2001-01-04, что приведет к:
timestamp_1 | timestamp_2 | id | agg_value
-----------------------------------------------------------
2001-01-01 00:00:00 | 2001-01-02 00:00:00 | 1 | 9 (=3+6)
2001-01-01 00:00:00 | 2001-01-02 00:00:00 | 2 | 15 (=5+10)
2001-01-01 00:00:00 | 2001-01-02 00:00:00 | 3 | 7 (=7)
-----------------------------------------------------------
2001-01-02 00:00:00 | 2001-01-03 00:00:00 | 1 | 6 (=6)
2001-01-02 00:00:00 | 2001-01-03 00:00:00 | 2 | 25 (=10+15)
2001-01-02 00:00:00 | 2001-01-03 00:00:00 | 3 | 21 (=7+14)
-----------------------------------------------------------
2001-01-03 00:00:00 | 2001-01-04 00:00:00 | 1 | 9 (=9)
2001-01-03 00:00:00 | 2001-01-04 00:00:00 | 2 | 35 (=15+20)
2001-01-03 00:00:00 | 2001-01-04 00:00:00 | 3 | 14 (=14)
(2) непересекающемуся делению в заданном диапазоне, для приведенного выше примера: с 2001-01-01 по 2001-01-02, С 2001-01-03 по 2001-01-04, что приведет к:
timestamp_1 | timestamp_2 | id | agg_value
-----------------------------------------------------------
2001-01-01 00:00:00 | 2001-01-02 00:00:00 | 1 | 9 (=3+6)
2001-01-01 00:00:00 | 2001-01-02 00:00:00 | 2 | 15 (=5+10)
2001-01-01 00:00:00 | 2001-01-02 00:00:00 | 3 | 7 (=7)
-----------------------------------------------------------
2001-01-03 00:00:00 | 2001-01-04 00:00:00 | 1 | 9 (=9)
2001-01-03 00:00:00 | 2001-01-04 00:00:00 | 2 | 35 (=15+20)
2001-01-03 00:00:00 | 2001-01-04 00:00:00 | 3 | 14 (=14)
(что в основном похоже на (1) без перекрытия)
Спасибо!
Отредактировано: добавление решения
У меня есть решение по крайней мере для (1):
SELECT t1.timestamp AS timestamp1,
MAX(t2.timestamp) AS timestamp2, t1.id,
SUM(t2.value) AS agg_value
FROM my_table t1
LEFT JOIN my_table t2 ON
(t2.timestamp >= t1.timestamp AND
t2.timestamp <= ADDDATE(t1.timestamp,INTERVAL 2 DAY) AND
t2.id = t1.id)
GROUP BY t1.timestamp, t1.id
Решением для (2) может быть просто фильтрация кподмножество вышеперечисленного.