【发布时间】:2018-01-28 15:53:29
【问题描述】:
我想计算 SQLite 表中数据的移动平均值。我在 MySQL 中找到了几种方法,但在 SQLite 中找不到有效的方法。
在 SQL 中,我认为应该这样做(但是,我无法尝试...):
SELECT date, value,
avg(value) OVER (ORDER BY date ROWS BETWEEN 3 PRECEDING AND 3 FOLLOWING) as MovingAverageWindow7
FROM t ORDER BY date;
但是,我看到了两个缺点:
- 这似乎不适用于 sqlite
- 如果数据在前一行/后一行的几个日期内不连续,它会在一个比我实际想要的更宽的窗口上计算移动平均值,因为它仅基于周围的行数。因此,应添加日期条件
确实,我希望它计算每个日期的“价值”平均值,超过 +/-3 天(每周移动平均)或 +/-15 天(每月移动平均)
这是一个示例数据集:
CREATE TABLE t ( date DATE, value INTEGER );
INSERT INTO t (date, value) VALUES ('2018-02-01', 8);
INSERT INTO t (date, value) VALUES ('2018-02-02', 2);
INSERT INTO t (date, value) VALUES ('2018-02-05', 5);
INSERT INTO t (date, value) VALUES ('2018-02-06', 4);
INSERT INTO t (date, value) VALUES ('2018-02-07', 1);
INSERT INTO t (date, value) VALUES ('2018-02-10', 6);
INSERT INTO t (date, value) VALUES ('2018-02-11', 0);
INSERT INTO t (date, value) VALUES ('2018-02-12', 2);
INSERT INTO t (date, value) VALUES ('2018-02-13', 1);
INSERT INTO t (date, value) VALUES ('2018-02-14', 3);
INSERT INTO t (date, value) VALUES ('2018-02-15', 11);
INSERT INTO t (date, value) VALUES ('2018-02-18', 4);
INSERT INTO t (date, value) VALUES ('2018-02-20', 1);
INSERT INTO t (date, value) VALUES ('2018-02-21', 5);
INSERT INTO t (date, value) VALUES ('2018-02-28', 10);
INSERT INTO t (date, value) VALUES ('2018-03-02', 6);
INSERT INTO t (date, value) VALUES ('2018-03-03', 7);
INSERT INTO t (date, value) VALUES ('2018-03-04', 3);
INSERT INTO t (date, value) VALUES ('2018-03-08', 5);
INSERT INTO t (date, value) VALUES ('2018-03-09', 6);
INSERT INTO t (date, value) VALUES ('2018-03-15', 1);
INSERT INTO t (date, value) VALUES ('2018-03-16', 3);
INSERT INTO t (date, value) VALUES ('2018-03-25', 5);
INSERT INTO t (date, value) VALUES ('2018-03-31', 1);
【问题讨论】:
-
这些 窗口函数 (
... OVER (...)) 可能不起作用,因为它们是在 SQLite 3.25 中引入的。我的版本(Ubuntu 18.04 附带)是 3.22,所以它对我也不起作用。 :-(
标签: sqlite moving-average