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

Beispielcode von Vue + Element UI zur Realisierung der Player-Funktion

Die Anzeige ohne Effektbild ist nur leeres Gerede...

Vue-Kapselungskomponententool $attrs, $listeners-Verwendung

Inhaltsverzeichnis Vorwort $attrs Beispiel: $list...

Vue Router vue-router ausführliche Erklärung Anleitung

Chinesische Dokumentation: https://router.vuejs.o...

Machen Sie sich nicht die Mühe mit JavaScript, wenn es mit CSS geht

Vorwort Jede Anwendung, die in JavaScript geschri...

Zukunftsweisendes Allround-Webdesign: Progressive Enhancement

<br />Original: Progressive Enhancement vers...

So fügen Sie dem Tomcat-Dienst einen Java-Startbefehl hinzu

Mein erstes Serverprogramm Ich lerne gerade, Onli...

Best Practices-Handbuch zum Speichern von Daten in MySQL

Inhaltsverzeichnis Vorwort Verwenden Sie keine Ze...

React implementiert doppelten Schieberegler zum Querschieben

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

Zusammenfassung gängiger Befehle in Dockerfile

Syntaxzusammensetzung: 1 Anmerkungsinformationen ...

Funktionsüberladung in TypeScript

Inhaltsverzeichnis 1. Funktionssignatur 2. Funkti...

Mybatis-Statistiken zur Ausführungszeit jeder SQL-Anweisung

Hintergrund In letzter Zeit werde ich in Intervie...

Detaillierte Erklärung des CSS-Pseudoelements::marker

Dieser Artikel stellt ein interessantes Pseudoele...

So kapseln Sie Axios in Vue

Inhaltsverzeichnis 1. Installation 1. Einleitung ...

So konfigurieren Sie https für Nginx in Docker

Websites ohne https-Unterstützung werden von Brow...