簡體   English   中英

SQL Server 2008使用SUM()OVER(ORDER BY ...)

[英]SQL Server 2008 using SUM() OVER(ORDER BY…)

我正在嘗試使用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 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

您找到的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中不可用。

您標記了SQL Server 2008。

在下一版本SQL Server 2012又名Denali之前,語法尚未就緒

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM