sql - 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 |
+--------------+--------------+
解决方案
您可以使用聚合。如果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)
推荐阅读
- json - Flutter json.decode 问题错误
- sql - 带有 CASE 条件的 SQL 可以在 PostgreSQL 中使用索引吗?
- swift4 - 在表格视图单元格中按首字母 Gold 的字母顺序对快速射击基础中的多个数据进行排序
- python-3.x - 将数据帧分数转换为浮点数
- java - 在 Spring Boot 中测试 javax.imageIo 找不到阅读器
- python - python 输出中的 Power shell 命令给出整数。为什么?
- c# - ASP.NET MVC 父子记录 iCollection 第一项
- dns - 回答 DNS 服务器不支持的查询类型的标准化方法是什么
- php - smarty 通过 php 处理强(文本)格式 -> 仅输出修改后的 php
- arrays - 防止重新计算命名范围中使用的用户定义函数