DENSE_RANK (Transact-SQL)

Gibt den Rang von Zeilen innerhalb der Partition eines Resultsets ohne Lücken in der Rangfolge an. Der Rang einer Zeile ist 1 plus die Anzahl der Ränge vor der fraglichen Zeile.

Themenlink (Symbol)Transact-SQL-Syntaxkonventionen

Syntax

DENSE_RANK ( )    OVER ( [ < partition_by_clause > ] < order_by_clause > )

Argumente

  • < partition_by_clause >
    Teilt das von der FROM-Klausel erzeugte Resultset in Partitionen, auf die die DENSE_RANK-Funktion angewendet wird. Informationen zur Syntax von PARTITION BY finden Sie unter OVER-Klausel (Transact-SQL).

  • < order_by_clause >
    Legt die Reihenfolge fest, in der die DENSE_RANK-Werte auf die Zeilen in einer Partition angewendet werden. Eine ganze Zahl kann keine Spalte in <order_by_clause> darstellen, wenn diese in einer Rangfolgefunktion verwendet wird.

Rückgabetypen

bigint

Hinweise

Wenn zwei oder mehr Zeilen den gleichen Rang in einer Partition beanspruchen, erhalten alle entsprechenden Zeilen denselben Rang. Wenn beispielsweise die beiden erfolgreichsten Vertriebsmitarbeiter denselben SalesYTD-Wert aufweisen, erhalten beide den Rang 1. Der Vertriebsmitarbeiter mit dem nächsthöchsten SalesYTD-Wert erhält Rang 2. Diese Zahl ist um 1 höher als die Anzahl der unterschiedlichen Zeilen vor dieser Zeile. Deshalb weisen die von der DENSE_RANK-Funktion zurückgegebenen Zahlen keine Lücken auf und bilden stets fortlaufende Rangfolgen.

Die für die gesamte Abfrage verwendete Sortierreihenfolge bestimmt die Reihenfolge, in der die Zeilen in einem Resultset angezeigt werden. Daraus geht hervor, dass eine als Rang 1 festgelegte Zeile nicht notwendigerweise die erste Zeile in der Partition sein muss.

Beispiele

Im folgenden Beispiel wird DENSE_RANK der Produktmenge an den verschiedenen Standorten zurückgegeben. Beachten Sie, dass ORDER BY in der OVER-Klausel DENSE_RANK sortiert und dass ORDER BY der SELECT-Anweisung das Resultset sortiert.

USE AdventureWorks;
GO
SELECT i.ProductID, p.Name, i.LocationID, i.Quantity, 
    DENSE_RANK() OVER (PARTITION BY i.LocationID ORDER BY i.Quantity)     AS DENSE_RANK
FROM Production.ProductInventory i 
    INNER JOIN Production.Product p 
        ON i.ProductID = p.ProductID
ORDER BY Name;
GO