Zurück zur Artikelliste Artikel
16 Leseminuten

Wie man Zeilen in SQL einordnet: Ein vollständiger Leitfaden

Kämpfen Sie nicht mehr mit SQL-RANK-Funktionen! Dieser Artikel führt Sie durch die häufigsten Anwendungsfälle für Ranglisten.

Ranglisten werden jeden Tag um uns herum verwendet. Sportwettkämpfe, die besten Filme und Fernsehserien auf Netflix, Geschäfte mit den günstigsten Produkten - das sind nur einige Beispiele für Ranglisten, die Sie vielleicht schon gesehen haben.

Die Verwendung von SQL RANK-Funktionen kann manchmal schwierig sein. Die Vielfalt der verschiedenen Konstruktionen ist enorm. Man kann sich leicht in all dem, was es über Rankings zu lernen gibt, verlieren. Der Schlüssel liegt darin, die wichtigen Konzepte zu verstehen und zu wissen, wo man nach zusätzlichen Informationen suchen muss.

In diesem Leitfaden finden Sie das Wissen, das es Ihnen ermöglicht, viele Arten von SQL-Ranking-Abfragen zu schreiben. Zunächst erkläre ich, wie das Ranking funktioniert. Dann zeige ich eine Reihe von Beispielen. Wenn Sie nach spezifischen Anwendungsfällen suchen, können Sie einfach in den Abschnitt Blättern Sie zum Abschnitt SQL Ranking Use Cases eintauchen.

SQL-Ranking-Funktionen sind Fensterfunktionen

Lassen Sie uns mit den Grundlagen beginnen. Was genau sind die Ranking-Funktionen in SQL? Sie gehören zu einer Familie von Funktionen, die Fensterfunktionen genannt werden. Fensterfunktionen verwenden einen Bereich (Fenster), der sich einen Teil der Daten ansieht, um das Ergebnis zu berechnen. Dann wechselt es zu einem anderen Teil der Daten und berechnet das Ergebnis für diesen Teil. Einen grundlegenden Einblick in die Funktionsweise erhalten Sie in SQL Window Function Beispiel mit Erklärungen.

Es gibt zwar viele verschiedene Fensterfunktionen, aber ich werde mich nur auf das Ranking konzentrieren. Ich werde auch nicht näher auf das Innenleben der Fensterfunktionen eingehen. Dieser Artikel konzentriert sich auf SQL-Ranking-Funktionen und deren Verwendung in verschiedenen Situationen. Um mehr über Fensterfunktionen zu erfahren, schauen Sie sich diesen Fensterfunktionen Kurs.

Grundlegende Ranking-Funktionen

Die gebräuchlichsten (und einfachsten) Arten von Ranglistenfunktionen sind:

  • RANK()
  • DENSE_RANK()
  • ROW_NUMBER()

Was bewirken sie und wie unterscheiden sie sich voneinander? Ich werde jede dieser Funktionen kurz erklären. Anschließend vergleiche ich die Rangfolgen der einzelnen Funktionen.

Die Funktion RANK() erstellt eine Rangfolge der Zeilen auf der Grundlage einer angegebenen Spalte. Sie beginnt damit, der ersten Zeile in der Reihenfolge eine "1" zuzuweisen, und vergibt dann höhere Zahlen an Zeilen, die weiter unten in der Reihenfolge stehen. Wenn die Zeilen den gleichen Wert haben, werden sie auch gleich gereiht. Der nächste Platz wird jedoch entsprechend verschoben. Wenn zum Beispiel zwei Zeilen auf Platz 5 stehen (den gleichen Rang haben), wird die nächste Zeile auf Platz 7 stehen (d.h. Platz 6 gibt es nicht).

Die Funktion DENSE_RANK() ist ziemlich ähnlich. Der einzige Unterschied besteht darin, dass sie keine Lücken in der Rangfolge hinterlässt. Auch wenn mehr als eine Zeile den gleichen Rang haben kann, erhält die nächste Zeile den nächsten Rang. Wenn z. B. zwei Zeilen den 5. Rang haben, wird die nächste Zeile den 6.

Die Funktion ROW_NUMBER() ist anders. Wenn Zeilen den gleichen Wert haben, erhalten sie alle aufeinanderfolgende Ränge (nicht den gleichen Rang wie bei den vorherigen Funktionen). Wenn z. B. zwei Zeilen den gleichen Wert haben (mit den vorherigen Funktionen wären sie beide auf Platz 5), würde ROW_NUMBER() sie auf Platz 5 und 6 platzieren.

Nun werden Sie sich vielleicht fragen: Wenn mehrere Zeilen denselben Wert haben und wir ROW_NUMBER() verwenden, wie können wir dann feststellen, welche Zeile die erste, zweite usw. ist? Die Antwort ist ziemlich düster: Wir können es nicht! Es hängt von vielen Faktoren ab, und man kann nicht vorhersagen, welche Zeile welchen Rang erhalten wird.

Dies sind die grundlegenden und (wahrscheinlich) am häufigsten verwendeten SQL-Ranking-Funktionen. Wenn Sie mehr über andere Ranking-Funktionen erfahren möchten, können Sie diesen Überblick über Ranking-Funktionen lesen.

RANK() vs. DENSE_RANK() vs. ROW_NUMBER()

Nachdem Sie nun die Theorie der Ranking-Funktionen kennen, lassen Sie uns die Ergebnisse dieser Funktionen vergleichen. Dazu ordnen wir einige Personen nach ihren Testergebnissen ein. Werfen Sie einen Blick auf die Daten (Tabelle exam_result):

first_namelast_namepoints
EmyrDownes70
DinaMorin70
Evie-MayBoyer80
NoraParkinson60
TrystanOconnor40
ErykMyers90
MarleneDuncan90
MariusPowell90
JoanneGoddard50
RayhanWilliamson90

Wir werden eine Abfrage erstellen, die die Zeilen nach der Punktespalte ordnet, indem wir die oben beschriebenen Ranking-Funktionen verwenden:

SELECT
  RANK() OVER(ORDER BY points DESC) AS rank,
  DENSE_RANK() OVER(ORDER BY points DESC) AS dense_rank,
  ROW_NUMBER() OVER(ORDER BY points DESC) AS row_number,
  first_name,
  last_name,
  points
FROM exam_result;

Lassen Sie uns den Code analysieren, bevor wir ihn ausführen, um die Ergebnisse zu sehen. Die erste Spalte, die wir anzeigen wollen, ist rank. Es handelt sich einfach um die Rangfolge, die mit der Funktion RANK() erstellt wurde. Aber was bedeutet OVER(ORDER BY points DESC)? Sie ist Teil des Konzepts der Fensterfunktionen. OVER() ist ein obligatorischer Bestandteil aller Ranking-Funktionen (eigentlich aller Fensterfunktionen). Er teilt der Funktion den Datenbereich (Fenster) und die Reihenfolge mit, in der die Zeilen angeordnet werden sollen. In diesem Fall haben wir nur die Reihenfolge angegeben. Ein Beispiel für die Definition eines Fensters finden Sie im Abschnitt RANK() OVER(PARTITION BY ...)-Einzelspalte.

Da Sie nun die erste Spalte verstehen, sollten Sie auch die beiden folgenden verstehen. Der einzige Unterschied ist der Name der Ranking-Funktionen. Auch die letzten drei Spalten sollten selbsterklärend sein, da Sie die Daten bereits gesehen haben.

Gut, sehen wir uns die Ergebnisse an:

rankdense_rankrow_numberfirst_namelast_namepoints
111MarleneDuncan90
112RayhanWilliamson90
113MariusPowell90
114ErykMyers90
525Evie-MayBoyer80
636EmyrDownes70
637DinaMorin70
848NoraParkinson60
959JoanneGoddard50
10610TrystanOconnor40

Können Sie die Unterschiede zwischen den einzelnen Funktionen erkennen? In den ersten paar Zeilen sehen die Spalten Rang und dense_rank gleich aus. row_number sieht jedoch von Anfang an anders aus. Obwohl Marlene, Rayhan, Marius und Eryk die gleiche Anzahl an Punkten haben, hat die Funktion ROW_NUMBER() ihnen unterschiedliche Werte zugewiesen. Wie bereits erwähnt, ist die Reihenfolge, in der diese Personen ihren Rang erhalten haben, nicht deterministisch.

Es ist erwähnenswert, dass man das Ergebnis von ROW_NUMBER() deterministischer gestalten kann. Dazu müssen Sie einfach weitere Spalten in die Reihenfolge einfügen (z. B. ROW_NUMBER() OVER (ORDER BY points DESC, last_name ASC)). Dies wird im Abschnitt Rang über mehrere Spalten näher erläutert.

Sie können auch ROW_NUMBER() noch weniger deterministisch machen! Obwohl der Teil ORDER BY für RANK() und DENSE_RANK() notwendig ist, benötigt ROW_NUMBER() ihn überhaupt nicht. So können Sie die Zeilen ohne eine bestimmte Reihenfolge nummerieren.

Ein weiterer Unterschied ist weiter unten in der Tabelle zu sehen. Evie-May liegt mit der Funktion RANK() auf Platz 5 und mit der Funktion DENSE_RANK() auf Platz 2. Die erste Funktion merkt sich, wie viele Zeilen den gleichen Rang haben, und die nächste Zeile wird dementsprechend gereiht. Bei der zweiten Funktion wird einfach der vorherige Wert betrachtet und die nächste Zeile erhält den nächsten Rang.

Nehmen Sie sich einen Moment Zeit, um die obigen Rangfolgen zu betrachten, und stellen Sie sicher, dass Sie den Unterschied zwischen diesen drei SQL-Rangfolgefunktionen verstehen. Es ist wichtig zu wissen, welche Funktion in welchen Fällen zu verwenden ist. Wenn Sie weitere Erklärungen benötigen, lesen Sie bitte Verwendung von Ranking-Funktionen in SQL.

SQL-Ranking Anwendungsfälle

Es ist an der Zeit, sich mit einigen SQL RANK Abfragen zu beschäftigen. Wir werden mit einigen einfachen Abfragen beginnen und die Komplexität schrittweise erhöhen. Der Plan sieht folgendermaßen aus:

Beachten Sie, dass wir zwar hauptsächlich die SQL-Funktion RANK() verwenden, die Beispiele aber auch auf DENSE_RANK() und ROW_NUMBER() angewandt werden können, je nach Bedarf. Daher ist es wichtig, die Unterschiede zwischen diesen Funktionen zu verstehen.

In den Beispielen werden wir die geänderten Daten aus dem vorherigen Beispiel verwenden. Die Spalte exam_date zeigt, wann die Person die Prüfung abgelegt hat, und die Spalte Stadt zeigt, in welcher city die Person die Prüfung abgelegt hat. Schauen Sie sich das an:

first_namelast_nameexam_datecitypoints
EmyrDownes2018-12-18San Francisco70
DinaMorin2019-01-17Los Angeles70
Evie-MayBoyer2019-01-23San Francisco80
NoraParkinson2019-02-16San Diego60
TrystanOconnor2019-02-28Los Angeles40
ErykMyers2019-06-07San Francisco90
MarleneDuncan2019-06-13San Diego90
MariusPowell2019-11-13San Diego90
JoanneGoddard2019-12-18San Diego50
MariusWilliamson2020-01-02San Diego90

Rang über einzelne Spalte

Wir beginnen mit dem einfachsten Anwendungsfall: der Erstellung einer Rangliste auf der Grundlage nur einer Spalte. Wir werden unsere Rangliste auf Punkten basieren:

SELECT
  RANK() OVER(ORDER BY points DESC) AS ranking,
  first_name,
  last_name,
  points
FROM exam_result;

Die Abfrage ist recht einfach, wie im vorherigen Beispiel. Sie erstellt eine Rangliste auf der Grundlage der Anzahl der Punkte in absteigender Reihenfolge. Wir verwenden RANK() OVER(ORDER BY ...), um anzugeben, welche Spalte für die Reihenfolge verwendet werden soll. Die Ergebnisse sehen wie folgt aus:

rankingfirst_namelast_namepoints
1MarleneDuncan90
1MariusWilliamson90
1MariusPowell90
1ErykMyers90
5Evie-MayBoyer80
6EmyrDownes70
6DinaMorin70
8NoraParkinson60
9JoanneGoddard50
10TrystanOconnor40

Wenn Sie eine Rangliste auf der Grundlage einer anderen Spalte oder in einer anderen Reihenfolge (d. h. aufsteigend statt absteigend) erstellen möchten, ändern Sie einfach den Spaltennamen oder das Schlüsselwort DESC in das Schlüsselwort ASC.

Rangfolge über mehrere Spalten

Die Verwendung mehrerer Spalten für die Sortierung ist ebenfalls einfach. Sie fügen einfach den nächsten Spaltennamen nach dem Komma ein. Wenn die Werte in der ersten Spalte gleich sind, wird die zweite Spalte berücksichtigt, und so weiter. Schauen Sie sich das an:

SELECT
  RANK() OVER(ORDER BY points DESC, first_name ASC) AS ranking,
  first_name,
  last_name,
  points
FROM exam_result;

Diese Abfrage ist ähnlich wie die vorherige. Wir haben first_name ASC zur Ordnungsklausel hinzugefügt. Wenn also mehrere Zeilen in der ersten Spalte den gleichen Wert haben, wird die zweite Spalte berücksichtigt. Beachten Sie, dass, wenn die zweite Spalte den gleichen Wert hat, die Rangfolge auf der Grundlage der von uns verwendeten Funktion (in unserem Fall RANK()) aufgelöst wird. Werfen Sie einen Blick auf das Ergebnis:

rankingfirst_namelast_namepoints
1ErykMyers90
2MariusWilliamson90
2MariusPowell90
4MarleneDuncan90
5Evie-MayBoyer80
6DinaMorin70
7EmyrDownes70
8NoraParkinson60
9JoanneGoddard50
10TrystanOconnor40

Wie Sie sehen können, erhalten Personen mit der gleichen Punktzahl unterschiedliche Platzierungen, weil sie unterschiedliche Namen haben. Die einzigen Ausnahmen sind die beiden Personen namens Marius. Da sie den gleichen Namen und die gleiche Punktzahl haben, haben sie den gleichen Rang.

Es ist erwähnenswert, dass das Ordnen nach einigen Spalten nützlich sein kann, wenn Sie das Ergebnis der Funktion ROW_NUMBER() deterministisch machen wollen. Werfen Sie einen Blick auf diese Abfrage:

SELECT
  ROW_NUMBER() OVER(ORDER BY points DESC, last_name ASC) AS ranking,
  first_name,
  last_name,
  points
FROM exam_result;

Da jeder in unseren Daten einen anderen Nachnamen hat, können wir ihn in die Ordnungsklausel aufnehmen, um vorherzusagen, wer welchen Rang erhält. Schauen Sie sich das an:

rankingfirst_namelast_namepoints
1MarleneDuncan90
2ErykMyers90
3MariusPowell90
4MariusWilliamson90
5Evie-MayBoyer80
6EmyrDownes70
7DinaMorin70
8NoraParkinson60
9JoanneGoddard50
10TrystanOconnor40

In diesem Fall funktioniert die Funktion ROW_NUMBER() wie RANK() und DENSE_RANK(), da jede Zeile deterministisch platziert werden kann. Wenn es jedoch Personen mit demselben Nachnamen gäbe, wäre die Funktion ROW_NUMBER() nicht deterministisch, obwohl wir nach zwei Spalten ordnen.

RANK() mit den 10 besten Ergebnissen

Wir erstellen oft Ranglisten, um die besten Ergebnisse anzuzeigen (z. B. Top 10, Top 100 usw.). Wie zu erwarten, können Sie die Top-Ergebnisse mit SQL-Ranking-Funktionen anzeigen. Eine solche Abfrage ist allerdings ein wenig komplizierter. Sehen Sie sich das an:

SELECT
  *
FROM (
  SELECT
    RANK() OVER(ORDER BY points DESC) AS ranking,
    first_name,
    last_name,
    points
  FROM exam_result
) AS a
WHERE ranking <= 3;

In dieser Abfrage verwenden wir eine Unterabfrage, um das Ranking zu berechnen, und filtern dann in der Hauptabfrage die Ergebnisse so, dass nur die drei besten angezeigt werden. Die Ergebnisse könnten Sie überraschen:

rankingfirst_namelast_namepoints
1MarleneDuncan90
1MariusWilliamson90
1MariusPowell90
1ErykMyers90

Wie Sie sehen können, zeigen die Ergebnisse vier Zeilen an, und jede von ihnen hat den gleichen Wert in der Rangordnungsspalte. Das liegt an unseren Daten. Vier Zeilen haben die gleiche Anzahl von Punkten und erhalten daher den gleichen Rang in der Unterabfrage.

Um eine solche Abfrage selbst zu schreiben, fügen Sie Ihre Rangabfrage in eine Unterabfrage ein und schreiben Sie eine Filterung um sie herum. Um zum Beispiel die 10 anzuzeigen, ändern Sie WHERE ranking <= 3 in WHERE ranking <= 10.

Es ist auch erwähnenswert, was passiert, wenn Sie DENSE_RANK() mit diesen Daten verwenden. Werfen Sie einen Blick auf die folgende Abfrage und ihre Ergebnisse:

SELECT
  *
FROM (
  SELECT
    DENSE_RANK() OVER(ORDER BY points DESC) AS ranking,
    first_name,
    last_name,
    points
  FROM exam_result
) AS a
WHERE ranking <= 3;
rankingfirst_namelast_namepoints
1MarleneDuncan90
1MariusWilliamson90
1MariusPowell90
1ErykMyers90
2Evie-MayBoyer80
3EmyrDownes70
3DinaMorin70

Wie Sie sehen können, enthält das Ergebnis eine Menge Zeilen! Auch hier liegt es daran, wie DENSE_RANK() die einzelnen Zeilen einordnet. Dieses Beispiel zeigt deutlich, dass es wichtig ist, den Unterschied zwischen den einzelnen Funktionen zu verstehen und zu wissen, welche in einer bestimmten Situation zu verwenden ist.

Rangfolge nach Datum

SELECT
  RANK() OVER(ORDER BY exam_date ASC) AS ranking,
  first_name,
  last_name,
  exam_date
FROM exam_result;

In diesem Fall verwenden wir einfach die Spalte exam_date für die Sortierung. Es gibt kaum einen Unterschied zwischen der Sortierung nach Datum und nach einer anderen Spalte. Schauen Sie sich die Ergebnisse an:

rankingfirst_namelast_nameexam_date
1EmyrDownes2018-12-18
2DinaMorin2019-01-17
3Evie-MayBoyer2019-01-23
4NoraParkinson2019-02-16
5TrystanOconnor2019-02-28
6ErykMyers2019-06-07
7MarleneDuncan2019-06-13
8MariusPowell2019-11-13
9JoanneGoddard2019-12-18
10MariusWilliamson2020-01-02

Wichtig ist, dass ASC (aufsteigend) im Falle von Datumsangaben bedeutet, dass das älteste Datum an erster Stelle steht. In der Reihenfolge DESC (absteigend) steht das neueste Datum an erster Stelle.

Rangfolge nach Monat

Vielleicht möchten Sie die Zeilen auch nur nach einem Teil des Datums (z. B. dem Monat) ordnen. Das ist gar nicht so schwer, wenn Sie die Datumsfunktionen kennen. Werfen Sie einen Blick auf die folgende Abfrage:

SELECT
  RANK() OVER(ORDER BY EXTRACT('year' FROM exam_date) ASC,
    EXTRACT('month' FROM exam_date) ASC) AS ranking,
  first_name,
  last_name,
  exam_date
FROM exam_result;

Wir verwenden die Funktion EXTRACT(), um einen bestimmten Teil des Datums zu extrahieren. Zuerst wollen wir die Zeilen nach Jahr und dann nach Monat ordnen. Wir verwenden also zuerst EXTRACT('year' FROM exam_date) und dann EXTRACT('month' FROM exam_date). Schauen Sie sich die Ergebnisse an:

rankingfirst_namelast_nameexam_date
1EmyrDownes2018-12-18
2Evie-MayBoyer2019-01-23
2DinaMorin2019-01-17
4NoraParkinson2019-02-16
4TrystanOconnor2019-02-28
6MarleneDuncan2019-06-13
6ErykMyers2019-06-07
8MariusPowell2019-11-13
9JoanneGoddard2019-12-18
10MariusWilliamson2020-01-02

EXTRACT() ist eine ziemlich einfache Funktion. Sie teilen ihr mit, welchen Teil des Datums Sie aus dem Datum extrahieren möchten. Es gibt eine Menge verschiedener Datumsbestandteile, die Sie verwenden können. Am besten konsultieren Sie die Dokumentation Ihres Datenbankmanagementsystems (DBMS). Die gebräuchlichsten Teile sind:

  • 'year'
  • 'month'
  • 'day'
  • 'hour'
  • 'minute'
  • 'second'

Es ist auch erwähnenswert, dass nicht alle DBMSs diese Funktion unterstützen. Zu den DBMS, die diese Funktion unterstützen, gehören PostgreSQL und MySQL. In SQL Server wird diese Funktion DATEPART() genannt.

Datums- und Zeitoperationen sind ein ziemlich schwieriges Thema, das den Rahmen dieses Artikels sprengen würde. Wenn Sie mehr über die Funktion EXTRACT() und vieles mehr wissen möchten, besuchen Sie den Standard-SQL-Funktionen Kurs. Dort ist ein ganzer Abschnitt den Datums- und Zeitoperationen gewidmet.

Ranking mit GROUP BY

Nun werden wir uns ansehen, wie man Ranglisten mit Aggregatfunktionen verwendet. Auch wenn es beängstigend klingt, ist es mit dem richtigen Verständnis ein ziemlich logisches Konzept. Ihre Datenbank berechnet zunächst die Aggregatfunktionen und erstellt dann eine Rangfolge auf der Grundlage der berechneten Werte. Werfen Sie einen Blick auf dieses Beispiel mit AVG():

SELECT
  RANK() OVER(ORDER BY AVG(points) DESC) AS ranking,
  city,
  AVG(points) AS average_points
FROM exam_result
GROUP BY city;

Wie Sie sehen können, unterscheidet sich diese Abfrage nicht wesentlich von den anderen Abfragen, die wir bisher gesehen haben. Sie können einfach Aggregatfunktionen innerhalb von Rankingfunktionen verwenden. Wichtig ist, dass Sie die GROUP BY Klausel verwenden. Wie bereits erwähnt, werden die Aggregatfunktionen zuerst berechnet. Das bedeutet, dass Sie mit GROUP BY nur Aggregatfunktionen oder die Ausdrücke, nach denen Sie gruppieren, innerhalb der Ranglistenfunktion verwenden können.

Wenn Sie beispielsweise eine andere Spalte für die Sortierung verwenden möchten, so dass die Zeilen nach dieser anderen Spalte sortiert werden, wenn die durchschnittliche Anzahl der Punkte gleich ist, müssen Sie diese andere Spalte in die GROUP BY Klausel aufnehmen.

Die obige Abfrage gibt die durchschnittliche Anzahl der Punkte zurück, die von Personen aus jeder Stadt erzielt wurden.

rankingcityaverage_points
1San Francisco80
2San Diego76
3Los Angeles55

Rangliste mit COUNT()

Schauen wir uns nun eine häufig verwendete Aggregatfunktion an -COUNT():

SELECT
  RANK() OVER(ORDER BY COUNT(*) DESC) AS ranking,
  city,
  COUNT(*) AS exam_takers
FROM exam_result
GROUP BY city;

Wie Sie sehen können, unterscheidet sich diese Abfrage nicht wesentlich von der vorherigen Abfrage. Alle Aggregatfunktionen werden auf die gleiche Weise mit Ranking-Funktionen verwendet.

Die Ergebnisse sind wie folgt:

rankingcityexam_takers
1San Diego5
2San Francisco3
3Los Angeles2

Die Abfrage berechnet die Anzahl der Personen, die die Prüfung in jeder Stadt abgelegt haben, und erstellt dann auf der Grundlage dieses Wertes eine Rangliste.

Rangliste mit SUM()

Eine weitere beliebte Aggregatfunktion ist SUM(). Sie ist ebenfalls recht einfach zu verwenden:

SELECT
  RANK() OVER(ORDER BY SUM(points) DESC) AS ranking,
  city,
  SUM(points) AS total_points
FROM exam_result
GROUP BY city;

Auch hier verwenden wir einfach die Funktion SUMME() mit der SQL-Funktion RANK().

rankingcitytotal_points
1San Diego380
2San Francisco240
3Los Angeles110

Diesmal berechnen wir die Gesamtzahl der Punkte, die von Personen aus jeder Stadt erworben wurden.

RANK() OVER(PARTITION BY ...)-Einzelspalte

Ich hoffe, dass Sie nun bereit sind, sich mit einem fortgeschritteneren Ranking-Konzept zu befassen: PARTITION BY. Es ermöglicht Ihnen, Ranglisten in getrennten Gruppen zu erstellen. Werfen Sie einen Blick auf diese Abfrage:

SELECT
  RANK() OVER(PARTITION BY city ORDER BY points DESC) AS ranking,
  city,
  first_name,
  last_name,
  points
FROM exam_result;

In dieser Abfrage verwenden wir PARTITION BY mit einer einzigen Spalte, um eine Rangliste der Personen in jeder Stadt zu erstellen. Auf diese Weise können wir die Personen mit den höchsten Punktzahlen in jeder Stadt sehen. Werfen Sie einen Blick auf die Ergebnisse:

rankingcityfirst_namelast_namepoints
1San FranciscoErykMyers90
2San FranciscoEvie-MayBoyer80
3San FranciscoEmyrDowes70
1Los AngelesDinaMorin70
2Los AngelesTrystanOconnor40
1San DiegoMarleneDuncan90
1San DiegoMariusPowell90
1San DiegoMariusWilliamson90
4San DiegoNoraParkinson60
5San DiegoJoanneGoddard50

Wie Sie sehen können, werden die Ranglisten für jede Stadt separat berechnet. Auf diese Weise erhalten Eryk und Dina denselben Rang, obwohl sie unterschiedliche Punktzahlen haben. Auch Dina und Emyr haben die gleiche Punktzahl, aber Dina ist besser platziert, weil sie die Prüfung in einer anderen Stadt abgelegt hat.

In einigen Fällen ist PARTITION BY ein wichtiges Konzept, das man sich merken sollte. Das Gute daran ist, dass es auch recht einfach zu verwenden ist. Wenn Sie jedoch weitere Informationen wünschen, sollten Sie Allgemeine SQL-Fensterfunktionen: Verwendung von Partitionen mit Ranking-Funktionen im Blog LearnSQL.de lesen.

RANK() OVER(PARTITION BY ...)-mehrere Spalten

Abschließend wollen wir uns die PARTITION BY Klausel mit mehreren Spalten ansehen. Es ist nicht viel anders als bei der Verwendung von PARTITION BY mit nur einer Spalte. Schauen Sie sich das an:

SELECT
  RANK() OVER(PARTITION BY city, first_name
    ORDER BY exam_date ASC) AS ranking,
  city,
  first_name,
  last_name,
  exam_date
FROM exam_result;

In der obigen Abfrage verwenden wir PARTITION BY mit zwei Spalten: city und first_name. Das bedeutet, dass wir für jedes eindeutige Paar aus Stadt und Vorname getrennte Ranglisten haben. Werfen Sie einen Blick auf die Ergebnisse:

rankingcityfirst_namelast_nameexam_date
1San FranciscoErykMyers2019-06-07
1San FranciscoEvie-MayBoyer2019-01-23
1San FranciscoEmyrDowes2018-12-18
1Los AngelesDinaMorin2019-01-17
1Los AngelesTrystanOconnor2019-02-28
1San DiegoMarleneDuncan2019-06-13
1San DiegoMariusPowell2019-11-13
2San DiegoMariusWilliamson2020-01-02
1San DiegoNoraParkinson2019-02-16
1San DiegoJoanneGoddard2019-12-18

Wie Sie oben sehen können, stehen die meisten Personen an erster Stelle. Das liegt daran, dass die meisten Paare (Stadt und Vorname) eindeutig sind. Es gibt jedoch ein Paar, das nicht eindeutig ist. Es gibt zwei Personen aus San Diego, die Marius heißen. Marius Powell ist der Erste, weil er die Prüfung früher abgelegt hat als Marius Williamson.

Denken Sie daran: Übung macht den Meister

Wie Sie sehen können, gibt es zahlreiche Anwendungsfälle für Rangfolge-Funktionen in SQL. Daher ist es wichtig, sie gut zu kennen - früher oder später werden Sie wahrscheinlich eine SQL-Ranking-Abfrage schreiben müssen.

Der beste Weg, sich mit Ranking-Funktionen (und Fensterfunktionen im Allgemeinen) vertraut zu machen, ist die Praxis. Ich empfehle diesen Fensterfunktionen Kurs. Er enthält 218 interaktive Übungen, was etwa 20 Stunden Programmieren entspricht. Das ist eine ganze Menge, vor allem, wenn Sie sich entscheiden, alles in einem Rutsch durchzuarbeiten. Davon raten wir ab. Es ist besser, das Studium auf mehrere Tage zu verteilen. Hier finden Sie weitere Tipps, wie Sie beim Lernen von SQL gesund bleiben können. Achten Sie auf Ihren Körper, während Sie Ihre Karriere vorantreiben, und fangen Sie noch heute an, SQL zu lernen.