我想在表格中计算滚动平均值,并跟踪每个计算出的窗框的开始时间。
我的问题是,与表中的行相比,我期望结果计数减少。但是我的查询重新调整了完全相同的行号。我想我知道为什么它不起作用,但是我不知道该怎么办。
假设我有一个表格,其中包含示例数据,如下所示:
+------+-------+
| 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 |
+--------------+--------------+
答案 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)