Sie sehen den Unterschied nur, wenn Sie innerhalb einer Partition Bindungen für einen bestimmten Bestellwert haben.
RANK
und DENSE_RANK
in diesem Fall deterministisch sind, erhalten alle Zeilen mit demselben Wert sowohl für die Ordnungs- als auch für die Partitionierungsspalte ein gleiches Ergebnis, während ROW_NUMBER
den gebundenen Zeilen willkürlich (nicht deterministisch) ein inkrementierendes Ergebnis zugewiesen wird.
Beispiel: (Alle Zeilen haben die gleichen StyleID
, befinden sich also in derselben Partition und innerhalb dieser Partition werden die ersten 3 Zeilen bei Bestellung von gebunden. ID
)
WITH T(StyleID, ID)
AS (SELECT 1,1 UNION ALL
SELECT 1,1 UNION ALL
SELECT 1,1 UNION ALL
SELECT 1,2)
SELECT *,
RANK() OVER(PARTITION BY StyleID ORDER BY ID) AS 'RANK',
ROW_NUMBER() OVER(PARTITION BY StyleID ORDER BY ID) AS 'ROW_NUMBER',
DENSE_RANK() OVER(PARTITION BY StyleID ORDER BY ID) AS 'DENSE_RANK'
FROM T
Kehrt zurück
StyleID ID RANK ROW_NUMBER DENSE_RANK
----------- -------- --------- --------------- ----------
1 1 1 1 1
1 1 1 2 1
1 1 1 3 1
1 2 4 4 2
Sie können sehen, dass für die drei identischen Zeilen die ROW_NUMBER
Inkremente der RANK
Wert derselbe bleibt, zu dem er springt 4
. DENSE_RANK
Weist allen drei Zeilen den gleichen Rang zu, aber dem nächsten eindeutigen Wert wird der Wert 2 zugewiesen.
Dieser Artikel behandelt eine interessante Beziehung zwischen
ROW_NUMBER()
undDENSE_RANK()
(dieRANK()
Funktion wird nicht speziell behandelt). Wenn Sie eineROW_NUMBER()
für eineSELECT DISTINCT
Anweisung generierte Anweisung benötigen ,ROW_NUMBER()
werden unterschiedliche Werte erzeugt, bevor sie durch dasDISTINCT
Schlüsselwort entfernt werden . ZB diese Abfrage... könnte dieses Ergebnis erzeugen (
DISTINCT
hat keine Auswirkung):Während diese Abfrage:
... produziert, was Sie in diesem Fall wahrscheinlich wollen:
Beachten Sie, dass die
ORDER BY
Klausel derDENSE_RANK()
Funktion alle anderen Spalten derSELECT DISTINCT
Klausel benötigt, um ordnungsgemäß zu funktionieren.Der Grund dafür ist, dass Fensterfunktionen
DISTINCT
logischerweise berechnet werden, bevor sie angewendet werden .Alle drei Funktionen im Vergleich
Verwenden der PostgreSQL / Sybase / SQL-Standardsyntax (
WINDOW
Klausel):... Du wirst kriegen:
quelle
Ein bisschen:
Der Rang einer Reihe ist eins plus die Anzahl der Ränge, die vor der betreffenden Reihe stehen.
Row_number ist der eindeutige Rang von Zeilen ohne Lücke in der Rangfolge.
http://www.bidn.com/blogs/marcoadf/bidn-blog/379/ranking-functions-row_number-vs-rank-vs-dense_rank-vs-ntile
quelle
Einfache Abfrage ohne Partitionsklausel:
Ausgabe:
quelle
Schauen Sie sich dieses Beispiel an.
Fügen Sie einige Daten ein
Wiederholen Sie dieselben Werte für 1
Schau alle
Schauen Sie sich Ihre Ergebnisse an
Müssen die verschiedenen verstehen
quelle
Achten Sie bei Verwendung von RANK auch auf ORDER BY in PARTITION (z. B. Standard AdventureWorks db wird verwendet).
Gibt Ergebnis:
SalesOrderID SalesOrderDetailID rank_same_as_partition rank_salesorderdetailid43659 1 1 1
43659 2 1 2
43659 3 1 3
43659 4 1 4
43659 5 1 5
43659 6 1 6
43659 7 1 7
43659 8 1 8
43659 9 1 9
43659 10 1 10
43659 11 1 11
43 1 12
Wenn Sie jedoch die Reihenfolge um ändern, verwenden Sie OrderQty:
Gibt:
SalesOrderID OrderQty rank_salesorderid rank_orderqty43659 1 1 1
43659 1 1 1
43659 1 1 1
43659 1 1 1
43659 1 1 1
43659 1 1 1
43659 2 1 7
43659 2 1 7
43659 3 1 9
43659 3 1 9
43659 4 1 11
43659 6 1 12
Beachten Sie, wie sich der Rang ändert, wenn wir OrderQty (zweite Tabelle in der rechten Spalte) in ORDER BY verwenden, und wie er sich ändert, wenn wir in ORDER BY SalesOrderDetailID (erste Tabelle in der rechten Spalte) verwenden.
quelle
Ich habe nichts mit Rang gemacht, aber ich habe dies heute mit row_number () entdeckt.
Dies führt zu einigen sich wiederholenden Zeilennummern, da in meinem Fall jeder Name alle Elemente enthält. Jeder Artikel wird nach Anzahl der verkauften Artikel sortiert.
quelle