sql - 移动平均线/滚动平均线

标签 sql sql-server sql-server-2008 statistics subquery

我在 MS SQL 中有 2 列,其中一列是序列号。另一个是值(value)观。我需要第三列,它给出该行和接下来的 2 行中的值的总和。

例如

SNo values
1 2
2 3
3 1
4 2
5 6
7 9
8 3
9 2

所以我需要第三列,其总和为 2+3+1、3+1+2 等等,因此第 8 行和第 9 行不会有任何值:

1   2   6   
2   3   6   
3   1   4   
4   2   5   
5   1   6   
7   2   7   
8   3       
9   2       

该解决方案可以是通用的,以便我可以改变当前窗口大小,将 3 个数字相加到一个更大的数字(例如 60)。

最佳答案

这是SQL Fiddle演示了以下查询:

WITH TempS as 
(
  SELECT s.SNo, s.value, 
  ROW_NUMBER() OVER (ORDER BY s.SNo) AS RowNumber
  FROM MyTable AS s
)
SELECT m.SNo, m.value,
(
  SELECT SUM(s.value) 
  FROM TempS AS s
  WHERE RowNumber >= m.RowNumber
  AND RowNumber <= m.RowNumber + 2
) AS Sum3InRow
FROM TempS AS m

在您的问题中,您要求对 3 个连续值求和。您修改了问题,表示需要求和的连续记录数可能会发生变化。在上面的查询中,您只需将 m.RowNumber + 2 更改为您需要的值。

因此,如果您需要 60,则使用

m.RowNumber + 59

如您所见,它非常灵活,因为您只需更改一个数字。

关于sql - 移动平均线/滚动平均线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20408060/

相关文章:

c# - 应用程序中包含的数据库

sql - 添加列值的 Case 语句

sql - 在 SQL 中使用位串(而不是整数)匹配位掩码

sql - 简单SQL:如何计算集合中重复项的唯一且连续的数字?

sql-server - 在 T-SQL 中使用月份名称显示日期时间

php - 在phpmyadmin中查询两个表

SQL Server 按 X 小时/天/周分组

c# - 你如何使用 SqlDataRecord 处理 Nullable 类型

mysql - 从mysql数据库中删除重复数据

mysql子字符串只获取字符