有很多方法可以做到這一點,而且性能有很大的變化。這里有一個特別優化的解決方案,來自中介、行號和性能..當涉及到在執行過程中生成的實際I/O時,這是一個特別優化的解決方案-它看起來比其他解決方案花費更高,但它實際上要快得多。
該頁面還包含其他解決方案和性能測試細節的討論。注意,在中間列的值相同的多行情況下,使用唯一列作為消歧器。
與所有數據庫性能場景一樣,始終嘗試使用真實硬件上的真實數據測試解決方案-您永遠不知道對SQLServer優化器的更改或您環境中的特性何時會使一個通??焖俚慕鉀Q方案變得更慢。
SELECT
CustomerId,
AVG(TotalDue)FROM(
SELECT
CustomerId,
TotalDue,
-- SalesOrderId in the ORDER BY is a disambiguator to break ties
ROW_NUMBER() OVER (
PARTITION BY CustomerId ORDER BY TotalDue ASC, SalesOrderId ASC) AS RowAsc,
ROW_NUMBER() OVER (
PARTITION BY CustomerId ORDER BY TotalDue DESC, SalesOrderId DESC) AS RowDesc FROM Sales.SalesOrderHeader SOH) xWHERE
RowAsc IN (RowDesc, RowDesc - 1, RowDesc + 1)GROUP BY CustomerIdORDER BY CustomerId;