sqlite 中的滚动平均值

Rolling Average in sqlite

我想计算 table 中的滚动平均值并跟踪每个计算的 window 帧的开始时间。

我的问题是,与 table 中的行相比,我希望结果计数减少。但我的查询返回完全相同的行号。我想我明白为什么它不起作用,但我不知道补救措施。

假设我有一个 table,示例数据如下所示:

+------+-------+
| Tick | Value |
+------+-------+
|    1 |     1 |
|    2 |     3 |_
|    3 |     5 |
|    4 |     7 |_
|    5 |     9 |
|    6 |    11 |_
|    7 |    13 |
|    8 |    15 |_
|    9 |    17 |
|   10 |    19 |_
+------+-------+

我想计算每第 n 个项目的平均值,例如两行(见上面的标记),这样我得到的结果是:

+--------------+--------------+
| OccurredTick | ValueAverage |
+--------------+--------------+
|            1 |            2 |
|            3 |            6 |
|            5 |           10 |
|            7 |           14 |
|            9 |           18 |
+--------------+--------------+

我试过

SELECT 
    FIRST_VALUE(Tick) OVER (
        ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING
    ) OccurredTick,
    AVG(Value) OVER (
        ROWS BETWEEN CURRENT ROW AND 2 FOLLOWING
    ) ValueAverage 
FROM TableName;

我在return中得到的是:

+--------------+--------------+
| OccurredTick | ValueAverage |
+--------------+--------------+
|            1 |            2 |
|            2 |            4 |
|            3 |            6 |
|            4 |            8 |
|            5 |           10 |
|            6 |           12 |
|            7 |           14 |
|            8 |           16 |
|            9 |           18 |
|           10 |           19 |
+--------------+--------------+

您可以使用聚合。如果 tick 总是在没有间隙的情况下增加:

select min(tick), avg(value) avg_value
from mytable
group by cast((tick - 1) / 2 as integer)

您可以将 2 更改为最适合的任何组大小。

如果tick不是连续递增的,我们可以用row_number()

生成一个序列
select min(tick), avg(value) avg_value
from (
    select t.*, row_number() over(order by tick) rn
    from mytable t
) t
group by cast((rn - 1) / 2 as integer)