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)
我想计算 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)