3

我正在尝试使用 CTE 和 CROSS JOIN 结果集。我想总结当前行的 4 行。我发现的在线示例不使用 CTE,仅使用新创建的表(http://sqlandme.com/2011/08/17/sql-server-denali-over-rows-range/)。语法应该可以工作,但我收到一条错误消息,提示“'ROWS' 附近的语法不正确”。

使用以下语句的示例输出如下: SUM(y) OVER(ORDER BY x ROWS 4 PRECEDING) sum

XY 总和


     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
4

2 回答 2

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 中不可用。

于 2011-10-04T18:50:35.033 回答
0

您标记了 SQL Server 2008。

直到下一个版本 SQL Server 2012 aka Denali 才准备好语法

于 2011-10-04T18:51:25.220 回答