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):
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:
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 […]