首页 > 解决方案 > sqlite中的滚动平均值

问题描述

我想在表格中计算滚动平均值并跟踪每个计算的窗口框架的开始时间。

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

假设我有一个包含如下示例数据的表:

+------+-------+
| 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;

我得到的回报是:

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

标签: sqlsqlitegroup-byaveragerolling-average

解决方案


您可以使用聚合。如果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)

推荐阅读