这是我的 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/