WITH rownums AS (
SELECT *, row_number() OVER (ORDER BY col1) AS rownum
FROM avg_test
),
averages AS (
SELECT avg(col2) OVER (ORDER BY rownum
ROWS BETWEEN 9 PRECEDING AND CURRENT ROW) AS average,
rownum
FROM rownums
)
SELECT average
FROM averages
WHERE rownum % 10 = 0
;
由于您尚未披露您打算使用的 RDBMS(在撰写本文时),我觉得有权发布特定于 PostgreSQL 的解决方案:
在第一个 CTE(称为
rownums
)中,我只是根据时间戳的顺序添加了行号。这对于以后能够找到每 10 行是必要的。(如果这个表上有一个额外的唯一键,这将是不必要的。)在averages
CTE 中,我计算每一行的移动平均值。设置窗口以便当前行和前九行给出要平均的数字。最后,我只是简单地每 10 行返回一次。row_number()
和都是这里avg()
的窗口函数。MySQL 缺少此功能,据我所知,H2 也缺少此功能。因此,我认为将 abov 查询移植到这些将涉及更多的技巧。在SQLFiddle 试试看。