Database
 sql >> Datenbank >  >> RDS >> Database

Ähnlichkeiten und Unterschiede zwischen RANK-, DENSE_RANK- und ROW_NUMBER-Funktionen

Die Funktionen RANK, DENSE_RANK und ROW_NUMBER werden verwendet, um einen ansteigenden ganzzahligen Wert abzurufen. Sie beginnen mit einem Wert, der auf der durch die ORDER BY-Klausel auferlegten Bedingung basiert. Alle diese Funktionen erfordern die ORDER BY-Klausel, um richtig zu funktionieren. Bei partitionierten Daten wird der Integer-Zähler für jede Partition auf 1 zurückgesetzt.

In diesem Artikel werden wir die Funktionen RANK, DENSE_RANK und ROW_NUMBER im Detail untersuchen, aber lassen Sie uns vorher Dummy-Daten erstellen, auf denen diese Funktionen verwendet werden können, es sei denn, Ihre Datenbank ist vollständig gesichert.

Dummy-Daten vorbereiten

Führen Sie das folgende Skript aus, um eine Datenbank namens ShowRoom zu erstellen, die eine Tabelle namens Cars enthält (die 15 zufällige Datensätze von Autos enthält):

CREATE Database ShowRoom;
GO
USE ShowRoom;

CREATE TABLE Cars
(
id INT,
name VARCHAR(50) NOT NULL,
company VARCHAR(50) NOT NULL,
power INT NOT NULL
)


USE ShowRoom
INSERT INTO Cars
VALUES
(1, 'Corrolla', 'Toyota', 1800),
(2, 'City', 'Honda', 1500),
(3, 'C200', 'Mercedez', 2000),
(4, 'Vitz', 'Toyota', 1300),
(5, 'Baleno', 'Suzuki', 1500),
(6, 'C500', 'Mercedez', 5000),
(7, '800', 'BMW', 8000),
(8, 'Mustang', 'Ford', 5000),
(9, '208', 'Peugeot', 5400),
(10, 'Prius', 'Toyota', 3200),
(11, 'Atlas', 'Volkswagen', 5000),
(12, '110', 'Bugatti', 8000),
(13, 'Landcruiser', 'Toyota', 3000),
(14, 'Civic', 'Honda', 1800),
(15, 'Accord', 'Honda', 2000)

RANK-Funktion

Die RANK-Funktion wird zum Abrufen von Rangreihen basierend auf der Bedingung der ORDER BY-Klausel verwendet. Wenn Sie beispielsweise den Namen des Autos mit der dritthöchsten Leistung finden möchten, können Sie die RANK-Funktion verwenden.
Sehen wir uns die RANK-Funktion in Aktion an:

SELECT name,company, power,
RANK() OVER(ORDER BY power DESC) AS PowerRank
FROM Cars

Das obige Skript findet und ordnet alle Datensätze in der Cars-Tabelle und ordnet sie nach absteigender Leistung. Die Ausgabe sieht so aus:

Die PowerRank-Spalte in der obigen Tabelle enthält den RANG der Autos, geordnet nach absteigender Reihenfolge ihrer Leistung. Eine interessante Sache an der RANK-Funktion ist, dass, wenn ein Unentschieden zwischen N vorherigen Datensätzen für den Wert in der ORDER BY-Spalte besteht, die RANK-Funktionen die nächsten N-1 Positionen überspringen, bevor sie den Zähler erhöhen. Beispielsweise gibt es im obigen Ergebnis ein Unentschieden für die Werte in der Leistungsspalte zwischen der 1. und 2. Zeile, daher überspringt die RANK-Funktion den nächsten (2-1 =1) einen Datensatz und springt direkt zur 3. Zeile.
Die RANK-Funktion kann in Kombination mit der PARTITION BY-Klausel verwendet werden. In diesem Fall wird der Rang für jede neue Partition zurückgesetzt. Sehen Sie sich das folgende Skript an:

SELECT name,company, power,
RANK() OVER(PARTITION BY company ORDER BY power DESC) AS PowerRank
FROM Cars

Im obigen Skript partitionieren wir die Ergebnisse nach Unternehmensspalte. Jetzt wird der RANG für jedes Unternehmen wie unten gezeigt auf 1 zurückgesetzt:

DENSE_RANK-Funktion

Die DENSE_RANK-Funktion ähnelt der RANK-Funktion, jedoch überspringt die DENSE_RANK-Funktion keine Ränge, wenn es ein Unentschieden zwischen den Rängen der vorhergehenden Datensätze gibt. Sehen Sie sich das folgende Skript an.

SELECT name,company, power,
RANK() OVER(PARTITION BY company ORDER BY power DESC) AS PowerRank
FROM Cars

Sie können der Ausgabe entnehmen, dass trotz eines Unentschiedens zwischen den Rängen der ersten beiden Zeilen der nächste Rang nicht übersprungen wird und ihm der Wert 2 statt 3 zugewiesen wurde. Wie bei der RANK-Funktion kann die PARTITION BY-Klausel dies auch mit der DENSE_RANK-Funktion wie unten gezeigt verwendet werden:

SELECT name,company, power,
DENSE_RANK() OVER(PARTITION BY company ORDER BY power DESC) AS DensePowerRank
FROM Cars

ROW_NUMBER-Funktion

Im Gegensatz zu den Funktionen RANK und DENSE_RANK gibt die Funktion ROW_NUMBER einfach die Zeilennummer der sortierten Datensätze zurück, beginnend mit 1. Wenn beispielsweise die Funktionen RANK und DENSE_RANK der ersten beiden Datensätze in der Spalte ORDER BY gleich sind, wird beiden 1 zugewiesen als ihr RANK und DENSE_RANK. Die ROW_NUMBER-Funktion weist diesen Zeilen jedoch die Werte 1 und 2 zu, ohne die Tatsache zu berücksichtigen, dass sie gleichermaßen berücksichtigt werden. Führen Sie das folgende Skript aus, um die Funktion ROW_NUMBER in Aktion zu sehen.

SELECT name,company, power,
ROW_NUMBER() OVER(ORDER BY power DESC) AS RowRank
FROM Cars

Aus der Ausgabe können Sie ersehen, dass die ROW_NUMBER-Funktion einfach jedem Datensatz unabhängig von seinem Wert eine neue Zeilennummer zuweist.
Die PARTITION BY-Klausel kann auch mit der ROW_NUMBER-Funktion verwendet werden, wie unten gezeigt:

SELECT name, company, power,
ROW_NUMBER() OVER(PARTITION BY company ORDER BY power DESC) AS RowRank
FROM Cars

Die Ausgabe sieht so aus:

Ähnlichkeiten zwischen den Funktionen RANK, DENSE_RANK und ROW_NUMBER

Die Funktionen RANK, DENSE_RANK und ROW_NUMBER haben die folgenden Ähnlichkeiten:
1- Alle erfordern eine Order-By-Klausel.
2- Alle geben eine steigende Ganzzahl mit einem Basiswert von 1 zurück.
3- Wenn sie mit einer PARTITION BY-Klausel kombiniert werden, setzen alle diese Funktionen den zurückgegebenen ganzzahligen Wert auf 1 zurück, wie wir gesehen haben.
4- Wenn es keine doppelten Werte in der Spalte gibt, die von der ORDER BY-Klausel verwendet wird, diese Funktionen geben die gleiche Ausgabe zurück.
Um den letzten Punkt zu veranschaulichen, erstellen wir eine neue Tabelle Car1 in der ShowRoom-Datenbank ohne doppelte Werte in der Leistungsspalte. Führen Sie das folgende Skript aus:

USE ShowRoom;

CREATE TABLE Cars1
(
id INT,
name VARCHAR(50) NOT NULL,
company VARCHAR(50) NOT NULL,
power INT NOT NULL
)


INSERT INTO Cars1
VALUES
(1, 'Corrolla', 'Toyota', 1800),
(2, 'City', 'Honda', 1500),
(3, 'C200', 'Mercedez', 2000),
(4, 'Vitz', 'Toyota', 1300),
(5, 'Baleno', 'Suzuki', 2500),
(6, 'C500', 'Mercedez', 5000),
(7, '800', 'BMW', 8000),
(8, 'Mustang', 'Ford', 4000),
(9, '208', 'Peugeot', 5400),
(10, 'Prius', 'Toyota', 3200)
The cars1 table has no duplicate values. Now let’s execute the RANK, DENSE_RANK and ROW_NUMBER functions on the Cars1 table ORDER BY power column. Execute the following script:
SELECT name,company, power,
RANK() OVER(ORDER BY power DESC) AS [Rank],
DENSE_RANK() OVER(ORDER BY power DESC) AS [Dense Rank],
ROW_NUMBER() OVER(ORDER BY power DESC) AS [Row Number]
FROM Cars1

Die Ausgabe sieht so aus:

Sie können sehen, dass es keine doppelten Werte in der Leistungsspalte gibt, die in der ORDER BY-Klausel verwendet wird, daher ist die Ausgabe der Funktionen RANK, DENSE_RANK und ROW_NUMBER gleich.

Unterschied zwischen den Funktionen RANK, DENSE_RANK und ROW_NUMBER

Der einzige Unterschied zwischen den Funktionen RANK, DENSE_RANK und ROW_NUMBER besteht darin, dass es doppelte Werte in der Spalte gibt, die in der ORDER BY-Klausel verwendet wird.
Wenn Sie zurück zur Cars-Tabelle in der ShowRoom-Datenbank gehen, können Sie sehen, dass sie viele enthält doppelte Werte. Versuchen wir, RANK, DENSE_RANK und ROW_NUMBER der Cars1-Tabelle zu finden, sortiert nach Leistung. Führen Sie das folgende Skript aus:
SELECT name,company, power,

RANK() OVER(ORDER BY power DESC) AS [Rank],
DENSE_RANK() OVER(ORDER BY power DESC) AS [Dense Rank],
ROW_NUMBER() OVER(ORDER BY power DESC) AS [Row Number]
FROM Cars

Die Ausgabe sieht so aus:

Aus der Ausgabe können Sie ersehen, dass die RANK-Funktion die nächsten N-1 Ränge überspringt, wenn es ein Unentschieden zwischen N vorherigen Rängen gibt. Andererseits überspringt die DENSE_RANK-Funktion keine Ränge, wenn zwischen den Rängen ein Unentschieden besteht. Schließlich hat die ROW_NUMBER-Funktion keine Bedeutung für das Ranking. Es gibt einfach die Zeilennummer der sortierten Datensätze zurück. Selbst wenn in der Spalte, die in der ORDER BY-Klausel verwendet wird, doppelte Datensätze vorhanden sind, gibt die ROW_NUMBER-Funktion keine doppelten Werte zurück. Stattdessen wird es unabhängig von den doppelten Werten weiter erhöht.

Nützliche Links:

Um mehr über die Funktionen ROW_NUMBER(), RANK() und DENSE_RANK() zu erfahren, lesen Sie den fantastischen Artikel von Ahmad Yaseen:

Methoden zum Rangieren von Zeilen in SQL Server:ROW_NUMBER(), RANK(), DENSE_RANK() und NTILE()