繁花不似锦
有很多方法可以做到这一点,而且性能有很大的变化。这里有一个特别优化的解决方案,来自中介、行号和性能..当涉及到在执行过程中生成的实际I/O时,这是一个特别优化的解决方案-它看起来比其他解决方案花费更高,但它实际上要快得多。该页面还包含其他解决方案和性能测试细节的讨论。注意,在中间列的值相同的多行情况下,使用唯一列作为消歧器。与所有数据库性能场景一样,始终尝试使用真实硬件上的真实数据测试解决方案-您永远不知道对SQLServer优化器的更改或您环境中的特性何时会使一个通常快速的解决方案变得更慢。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;