sqlite滚动平均值

时间:2020-04-03 13:37:21

标签: sql sqlite group-by average rolling-average

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

我的问题是,与表中的行相比,我期望结果计数减少。但是我的查询重新调整了完全相同的行号。我想我知道为什么它不起作用,但是我不知道该怎么办。

假设我有一个表格,其中包含示例数据,如下所示:

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

1 个答案:

答案 0 :(得分:1)

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