Im Artikel "SQL Sever 2005: Using OVER() with Aggregate Functions" wird auf SQLTeam.com ein nettes Feature beschrieben, das mir bisher entging:
Man kann (ohne Angabe von Group-By) eine Aggregatfunktion nur auf gruppen berechnen lassen. "Früher" war dazu eine Subquery notwendig oder etwas performanter ein Join mit einer Derived-Table. Jetzt kann das sehr elegant in einem Schupps erledigen.
So steht es in einem Bespiel meiner TSQL-Schulung (Datenbank "Northwind", die mag ich immer noch recht gerne):
select P.ProductName,
P.UnitPrice,
P.CategoryID,
(select avg(Pc.UnitPrice)
from "Products" as Pc
where Pc.CategoryID=P.CategoryID)
as "durchschn. Preis der Produktklasse"
from "Products" as P
So könnte es zukünftig aussehen:
select P.ProductName,
P.UnitPrice,
P.CategoryID,
avg(P.UnitPrice) over (Partition by P.CategoryID)
as "durchschn. Preis der Produktklasse"
from "Products" as P
Allerdings bin ich mit dem Zugriffsplan der zweiten Variante noch nicht wirklich zufrieden. Durch die Subquery hat man einen Nested-Loop-Join, durch das Partition-By einen Sort. Was "besser" ist, kann man so pauschal nicht sagen, möglicherweise wäre ein Clustered-Index auf die Spalten in dem Partion-By ideal.
gefunden im SQL Server FAQ Blog
[…] siehe Sebastian Weber, MSDN und hier […]