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