Fassen Sie einige häufige Rankingprobleme in MySQL zusammen

Fassen Sie einige häufige Rankingprobleme in MySQL zusammen

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:
  • MySQL implementiert Ranking und fragt die angegebene Benutzer-Ranking-Funktion ab (parallele Ranking-Funktion) Beispielcode
  • MySQL-Sortierung zum Abrufen eines Ranking-Beispielcodes
  • MySQL-Seitenzugriffsstatistiken und -Rankings
  • So fügen Sie den Ergebnissen benutzerdefinierter Feldabfragen in MySQL eine Rangfolge hinzu
  • MySQL-Gruppierung, um die ersten paar Datensätze in jeder Gruppe (Ranking) mit Recherche nach „Gruppieren nach“ und „Sortieren nach“ zu erhalten

<<:  Verwendung des Linux-Befehls tr

>>:  Zwei Möglichkeiten, Vue-Benutzer dazu zu bringen, sich über einen längeren Zeitraum ohne Bedienung von der Anmeldeseite abzumelden

Artikel empfehlen

HTML-Grammatik-Enzyklopädie_HTML-Sprachgrammatik-Enzyklopädie (unbedingt lesen)

Datenträgerbezeichnung, Eigenschaftsname, Beschre...

JavaScript imitiert den Jingdong-Lupeneffekt

In diesem Artikel wird der spezifische Code für J...

So aktualisieren Sie die Ansicht synchron nach Datenänderungen in Vue

Vorwort Vor kurzem bin ich auf ein interessantes ...

Detaillierte Erklärung der MySql-Installation und des Logins

Überprüfen Sie, ob MySQL bereits unter Linux inst...

Gutes Website-Copywriting und gute Benutzererfahrung

Das Betrachten einer Website ist eigentlich wie di...

Eine kurze Diskussion über Yahoos 35 Regeln zur Front-End-Optimierung

Zusammenfassung: Ob bei der Arbeit oder im Vorste...

So zeichnen Sie eine Schaltfläche in XAML als Kreis neu

Beim Verwenden des XAML-Layouts müssen manchmal ei...

Tipps zum Mischen von OR und AND in SQL-Anweisungen

Heute gibt es eine solche Anforderung. Wenn die a...

So blockieren Sie IP und IP-Bereich in Nginx

Vorne geschrieben Nginx ist nicht nur ein Reverse...