SQL Server 2005中的窗口函數(window function)與微軟Windows無關;相反,它們建立數據窗口。窗口函數幫助你迅速查看不同級別的聚合,通過它可以非常方便地恢復累計總數、移動平均值、以及執行其它計算。
一個SQL Server窗口是對函數應用的行的分區。你使用OVER(…)子句指定一個窗口,你可以對任何一個聚合函數應用這個子句。通常來說,你把數據分成幾個組,但OVER()的自變量可選。
列表A說明如何一次搜集幾個聚集,甚至根據聚合進行其它計算。這樣就可得到列表B中的結果集。我把結果集限定為一個單獨的OrderID,那麼查詢將只產生一個窗口。你可以用各種方式修改子句,如使用一個IN()子句列出一組特殊的順序,或使用一個BETWEEN子句推導一個順序范圍內的統計值。最後你指定的每個OrderID都得到一個窗口。
窗口函數功能非常強大,建立起來也十分容易。你可以使用這個技巧立即搜索到大量統計值。這個教程中的例子指出,你可以在單獨一個查詢中搜索任何統計值集合。
列表A
USE AdventureWorks2;GOSELECT SalesOrderID, ProductID, OrderQty AS 'Item Qty' ,SUM(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Total Qty' ,AVG(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Average Qty' ,COUNT(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Total Count' ,MIN(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Minimum Count' ,MAX(OrderQty) OVER(PARTITION BY SalesOrderID) AS 'Maximum Count' ,LineTotal ,AVG(LineTotal) OVER(PARTITION BY SalesOrderID) AS 'Average Amount' ,SUM(LineTotal) OVER(PARTITION BY SalesOrderID) AS 'Total Amount' ,(LineTotal/SUM(LineTotal) OVER(PARTITION BY SalesOrderID)) * 100 AS 'Percent'FROM Sales.SalesOrderDetail WHERE SalesOrderID = 43664ORDER BY ProductID
GO列表B43664 714 1 14 1 8 1 4 28.840400 3054.07610024432.608800 0.118000
43664 716 1 14 1 8 1 4 28.840400 3054.07610024432.608800 0.118000
43664 771 3 14 1 8 1 4 6119.9820003054.07610024432.608800 25.048400
43664 772 1 14 1 8 1 4 2039.9940003054.07610024432.608800 8.349400
43664 773 1 14 1 8 1 4 2039.9940003054.07610024432.608800 8.349400
43664 775 4 14 1 8 1 4 8099.9760003054.07610024432.608800 33.152300
43664 777 2 14 1 8 1 4 4049.9880003054.07610024432.608800 16.576100