Vorwort: In manchen Anwendungsszenarien stoßen wir häufig auf Rankingprobleme, beispielsweise beim Ranking nach Klassen oder Alter. Es gibt viele Möglichkeiten zur Rangfolge, z. B. direkte Rangfolge, Gruppenrangfolge, Rangfolge mit Intervallen oder Rangfolge ohne Intervalle usw. Dieser Artikel fasst einige häufige Rangfolgeprobleme in MySQL zusammen. Erstellen einer Testtabelle Tabelle scores_tb erstellen ( id int auto_increment Primärschlüssel, xuehao int nicht null, Punktzahl int nicht null )ENGINE=InnoDB STANDARD-CHARSET=utf8; in scores_tb (xuehao, score) Werte (1001,89),(1002,99),(1003,96),(1004,96),(1005,92),(1006,90),(1007,90),(1008,94) einfügen; # Zeigen Sie die eingefügten Daten anmysql> select * from scores_tb; +----+--------+-------+ | ID | xuehao | Punktzahl | +----+--------+-------+ | 1 | 1001 | 89 | | 2 | 1002 | 99 | | 3 | 1003 | 96 | | 4 | 1004 | 96 | | 5 | 1005 | 92 | | 6 | 1006 | 90 | | 7 | 1007 | 90 | | 8 | 1008 | 94 | +----+--------+-------+ 1. Ordentliche Rangliste Ordnen Sie direkt nach der Punktzahl, beginnend bei 1 und absteigend, ähnlich wie bei der Zeilennummer. Nachfolgend geben wir die Abfrageanweisung und die Rangfolgeergebnisse an. # Abfrageanweisung SELECT xuehao, score, @curRank := @curRank + 1 AS rank VON scores_tb, ( SELECT @curRank := 0 ) ORDER BY Punktzahl absteigend; # Ergebnisse sortieren +--------+-------+------+ | xuehao | Punktzahl | Rang | +--------+-------+------+ | 1002 | 99 | 1 | | 1003 | 96 | 2 | | 1004 | 96 | 3 | | 1008 | 94 | 4 | | 1005 | 92 | 5 | | 1006 | 90 | 6 | | 1007 | 90 | 7 | | 1001 | 89 | 8 | +--------+-------+------+ In der obigen Abfrageanweisung deklarieren wir eine Variable @curRank und initialisieren sie auf 0. Wenn eine Zeile gefunden wird, erhöhen wir die Variable um 1 und verwenden sie als Rangfolge. Wir können sehen, dass es bei dieser Art von Rangliste keine Lücken gibt und einige die gleiche Punktzahl, aber unterschiedliche Ranglisten haben. 2. Gleiche Punktzahlen, gleiche Platzierungen, keine Lücke in der Rangliste # Abfrageanweisung SELECT xuehao, score, FALL WENN @prevRank = Punktzahl, DANN @curRank WENN @prevRank := Punktzahl DANN @curRank := @curRank + 1 END AS Rang VON scores_tb, (SELECT @curRank := 0, @prevRank := NULL) ORDER BY Punktzahl absteigend; # Ranking-Ergebnisse+--------+-------+------+ | xuehao | Punktzahl | Rang | +--------+-------+------+ | 1002 | 99 | 1 | | 1003 | 96 | 2 | | 1004 | 96 | 2 | | 1008 | 94 | 3 | | 1005 | 92 | 4 | | 1006 | 90 | 5 | | 1007 | 90 | 5 | | 1001 | 89 | 6 | +--------+-------+------+ 3. Gleichstand bei den Platzierungen, mit Lücken in den Platzierungen Eine andere Rangfolgemethode besteht darin, dass derselbe Wert die gleiche Rangfolge hat und die nächste Rangfolge des gleichen Werts ein springender ganzzahliger Wert sein sollte, d. h. es gibt Lücken in der Rangfolge. # Abfrageanweisung SELECT xuehao, score, rank FROM (WÄHLEN Sie xuehao, Punktzahl, @curRank := WENN(@prevRank = Punktzahl, @curRank, @incRank) ALS Rang, @incRank := @incRank + 1, @prevRank := Punktzahl VON scores_tb, ( AUSWÄHLEN @curRank := 0, @prevRank := NULL, @incRank := 1 ) ORDER BY Punktzahl absteigend) s; # Ranking-Ergebnisse+--------+-------+------+ | xuehao | Punktzahl | Rang | +--------+-------+------+ | 1002 | 99 | 1 | | 1003 | 96 | 2 | | 1004 | 96 | 2 | | 1008 | 94 | 4 | | 1005 | 92 | 5 | | 1006 | 90 | 6 | | 1007 | 90 | 6 | | 1001 | 89 | 8 | +--------+-------+------+ Die drei oben vorgestellten Rankingmethoden sind relativ kompliziert umzusetzen. Glücklicherweise wurden in MySQL 8.0 Fensterfunktionen hinzugefügt, und die obige Rangfolge kann mithilfe integrierter Funktionen problemlos erreicht werden. MySQL 8.0 verwendet Fensterfunktionen zur Implementierung des Rankings In MySQL 8.0 können Sie die drei Fensterfunktionen ROW_NUMBER(), DENSE_RANK() und RANK() verwenden, um die oben genannten drei Ranglisten zu implementieren. Zu beachten ist, dass der Alias nach as nicht mit dem vorherigen Funktionsnamen identisch sein darf, da sonst ein Fehler gemeldet wird. Im Folgenden finden Sie Beispiele für die Implementierung von Ranglisten durch diese drei Funktionen: # Drei Anweisungen für die obigen drei Ranglisten select xuehao,score, ROW_NUMBER() OVER(order by score desc) as row_r from scores_tb; wähle xuehao, score, DENSE_RANK() OVER (sortiere nach score desc) als dense_r aus scores_tb; wähle xuehao, score, RANK() über (sortieren nach score desc) als r aus scores_tb; # Eine Anweisung kann auch verschiedene Rankings abfragen SELECT xuehao,score, ROW_NUMBER() ÜBER w AS 'row_r', DENSE_RANK() ÜBER w AS 'dense_r', RANK() ÜBER w AS 'r' VON `scores_tb` FENSTER w AS (ORDER BY `score` desc); # Ranking-Ergebnisse+--------+-------+----------+---------+---+ | xuehao | Punktzahl | Zeile_r | dichtes_r | r | +--------+-------+----------+---------+---+ | 1002 | 99 | 1 | 1 | 1 | | 1003 | 96 | 2 | 2 | 2 | | 1004 | 96 | 3 | 2 | 2 | | 1008 | 94 | 4 | 3 | 4 | | 1005 | 92 | 5 | 4 | 5 | | 1006 | 90 | 6 | 5 | 6 | | 1007 | 90 | 7 | 5 | 6 | | 1001 | 89 | 8 | 6 | 8 | +--------+-------+----------+---------+---+ Zusammenfassen: Dieser Artikel enthält SQL-Anweisungen zur Implementierung statistischer Rangfolgen in drei verschiedenen Szenarien. Sie können die geeignete Rangfolgelösung basierend auf den unterschiedlichen Geschäftsanforderungen auswählen. Im Vergleich zu MySQL 8.0 stellen wir fest, dass die Rangfolge durch die Verwendung von Fensterfunktionen einfacher erreicht werden kann. Tatsächlich sind die Geschäftsanforderungen viel komplizierter als die von uns angegebenen Beispiele. Es braucht immer noch Zeit, um Erfahrung zu sammeln, um solche Geschäftsanforderungen mit SQL umzusetzen. Oben finden Sie eine detaillierte Zusammenfassung einiger häufiger Ranking-Probleme in MySQL. Weitere Informationen zum MySQL-Ranking finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM! Das könnte Sie auch interessieren:
|
<<: Verwendung des Linux-Befehls tr
Im Projekt werden Sie auf benutzerdefinierte öffe...
Szenario: Beim Starten von Tomcat in Docker (Vers...
Einführung Die meisten Leute, die schon einmal Da...
Betriebssystem: Windows 10_x64 Python-Version: 3....
Inhaltsverzeichnis 1. Unzip-Befehl 1.1 Syntax 1.2...
Laden Sie das MySQL-Installationsprogramm herunte...
Inhaltsverzeichnis Anforderungen: Implementierung...
Dieser Artikel stellt hauptsächlich die Implement...
Für die Installation von Docker auf CentOS muss d...
Wenn wir eine Hintergrundfarbe mit Farbverlauf er...
Inhaltsverzeichnis veranschaulichen 1. Blob-Objek...
Lassen Sie mich zunächst über die Implementierung...
Inhaltsverzeichnis Fehler 1: Zu viele Datenspalte...
Erstellen einer Testtabelle -- ------------------...
chmod-Befehlssyntax Dies ist die korrekte Syntax ...