我正在尝试使用CTE和CROSS JOIN结果集。我想总结一下导致当前行的4行。我发现的在线示例不使用CTE,只使用新创建的表(http://sqlandme.com/2011/08/17/sql-server-denali-over-rows-range/)。语法应该有效,但是我收到一条错误,说“'ROWS'附近的语法不正确”。
示例输出将使用以下语句: SUM(y)OVER(顺序x行4前进)总和
X Y SUM
1 7 0 No prev rows, so sum is 0
2 1 7 Sum = 7
3 2 8 = 1 + 7
4 5 10 = 2 + 1 + 7
5 7 15 = 5 + 2 + 1 + 7
6 34 15 = 7 + 5 + 2 + 1
7 32 48 = 34 + 7 + 5 + 2
有没有人对查询的错误有什么建议?提前谢谢。
with quarterResults as (
<subquery in here>
)
--COLUMN1: String
--COLUMN2: Date
--COLUMN3: Date
--COLUMN4: Double
select a.TIC, a.DATADATE, a.EFFDATE, SUM(b.valuei) OVER (ORDER BY a.TIC, a.DATADATE, a.EFFDATE ROWS 4 PRECEDING) AS [SUM]
from quarterResults a
cross join quarterResults b
where a.datadate > b.datadate
group by a.tic, a.datadate, a.EFFDATE, a.valuei
order by a.TIC, a.datadate
答案 0 :(得分:2)
您为ROWS / RANGE找到的文档不适用于SQL Server 2008 - 它适用于SQL Server的未来版本。
要在SQL 2008中完成查询,一种方法类似于:
SELECT a.TIC, a.datadate, a.effdate, x.s
FROM quarterResults a
CROSS APPLY ( SELECT ISNULL(SUM(v), 0)
FROM ( SELECT TOP(4) b.valuei
FROM quarterResults b
WHERE b.datadate < a.datadate
ORDER BY b.datadate DESC ) x(v)
) x(s)
ORDER BY a.TIC, a.datadate
请注意,这可能是一个昂贵的查询。将OVER表达式与ROWS一起使用可能会更有效,但同样,它在SQL Server 2008中不可用。
答案 1 :(得分:0)
您标记了SQL Server 2008.
在下一版本SQL Server 2012又名Denali
之前,语法尚未就绪