我需要计算 5 分钟的平均值,并希望在相同的 5 分钟间隔内计算方差。
简而言之:
- 创建 5 分钟平均值的视图
- 使用这个视图来计算方差,很像上面这个线程中的 CL,虽然我不同意
COUNT()-1 中的 -1。
也许不是很优雅,但对我来说更容易捕捉。我使用 LibreOffice Calc(VAR.P 函数)检查了结果。
数据
数据位于名为magic 的表中。
CREATE TABLE magic(
"dt" TEXT,
"qccm" REAL,
PRIMARY KEY (dt)
);
创建 5 分钟平均值视图
CREATE VIEW v_magic5m(
"dt",
"qccm",
)
AS SELECT
datetime(round(cast(strftime('%s',dt) AS INT)/300)*300, 'unixepoch') AS rndtime,
avg(qccm),
GROUP BY rndtime;
计算方差
WITH tmp
AS (
SELECT
datetime(round(cast(strftime('%s',dt) AS INT)/300)*300, 'unixepoch') AS rnd_dt,
qccm
FROM magic
)
SELECT
tmp.rnd_dt,
v_magic5m.qccm AS avg_qccm,
SUM( (tmp.qccm - v_magic5m.qccm)*(tmp.qccm - v_magic5m.qccm) ) / COUNT(tmp.qccm) AS var_qccm
FROM tmp
LEFT JOIN v_magic5m ON tmp.rnd_dt=v_magic5m.dt
GROUP BY tmp.rnd_dt;
输出看起来像这样:
rnd_dt avg_qccm var_qccm
------------------- ---------------- ----------------
2021-04-28 09:55:00 334.292929292929 765.924293439445
2021-04-28 10:00:00 332.743333333333 571.924122222222
2021-04-28 10:05:00 333.04 501.165066666667