23rd Jun 2022 16 Leseminuten Wie man Zeilen in SQL einordnet: Ein vollständiger Leitfaden Kamil Bladoszewski Window Functions Inhaltsverzeichnis SQL-Ranking-Funktionen sind Fensterfunktionen Grundlegende Ranking-Funktionen RANK() vs. DENSE_RANK() vs. ROW_NUMBER() SQL-Ranking Anwendungsfälle Rang über einzelne Spalte Rangfolge über mehrere Spalten RANK() mit den 10 besten Ergebnissen Rangfolge nach Datum Rangfolge nach Monat Ranking mit GROUP BY Rangliste mit COUNT() Rangliste mit SUM() RANK() OVER(PARTITION BY ...)-Einzelspalte RANK() OVER(PARTITION BY ...)-mehrere Spalten Denken Sie daran: Übung macht den Meister 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: Basis-Ranking: Rang über einzelne Spalte Rang über mehrere Spalten RANK() mit den 10 besten Ergebnissen Rangliste mit Daten: Rangliste nach Datum Rangliste nach Monat Rangliste mit Aggregatfunktionen: Rangliste mit GROUP BY Rangliste mit COUNT() Rangliste mit SUM() Verwendung der Partitionierung durch: RANK() OVER(PARTITION BY ...)-Eine Spalte RANK() OVER(PARTITION BY ...)-Mehrere Spalten 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. Tags: Window Functions