SQL Server窗口函数: can you do a ROW BETWEEN type construct?

标签 sql sql-server t-sql sql-server-2008

这是我的 SQL Server 版本:

Microsoft SQL Server 2008 (SP2) - 10.0.4064.0 (X64) Feb 25 2011 13:56:11 Copyright (c) 1988-2008 Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.0 (Build 6002: Service Pack 2)

我想做这样的事情(在 Sybase 中有效):

SELECT AVG(ct) OVER (PARTITION BY val1 
                         ORDER BY val2 ASC ROWS BETWEEN 6 PRECEDING AND CURRENT ROW)
FROM table

有没有一种方法可以实现这样的事情,而不需要一些令人讨厌的自连接或使用行号等的子查询?我想如果我必须这样做我会的,但我很乐意使用最好的最紧凑的代码。

编辑:
根据评论,这就是我想做的。

我有一个 time_id 和一个值。我想取该值的移动平均值(1 周)。非常简单。

最佳答案

这就是我可能会做的事情:

WITH ranked AS (
  SELECT
    val1,
    val2,
    ct,
    rank = ROW_NUMBER() OVER (PARTITION BY val1 ORDER BY val2)
  FROM table
)
SELECT
  r.val1,
  r.val2,
  avg_ct = AVG(r2.ct)
FROM ranked r
  INNER JOIN ranked r2 ON r2.val1 = r.val1
                      AND r2.rank BETWEEN r.rank - 6 AND r.rank
GROUP BY r.val1, r.val2

绝对不如 Sybase 版本那么优雅和简洁,但对我来说,也不错。

关于SQL Server窗口函数: can you do a ROW BETWEEN type construct?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6524726/

相关文章:

sql-server - 为什么 "sys.sql_expression_dependencies"没有 Azure 数据仓库中存储过程的任何引用?

python - 如何在本地错误日志文件中获取 Redshift 错误?

c# - sql语法错误-无法将字符串追加到数据库

sql-server - SQL 服务器 : NOT IN in where clause not working with NVARCHAR

SQL Server 在 select 语句中使用聚合函数连接记录

sql-server - 参数化存储过程条件连接,通过 3 个参数在连接表中搜索

sql - 在 SQL 中拆分 FullName

mysql - 从子表中选择多行数据以及MySQL中的父行表

sql - 如何用另一个表的列中的值来约束一列?

c# - 为什么应用程序会抛出多个 "Operation is not valid due to the current state of the object"错误?