Ein möglicher Fehler, wenn MySQL die Summenfunktion auf der Fensterfunktion ausführt

Ein möglicher Fehler, wenn MySQL die Summenfunktion auf der Fensterfunktion ausführt

Beim Verwenden der MySql-Fensterfunktion zum Sammeln statistischer Daten habe ich ein kleines Problem festgestellt und möchte es mit Ihnen besprechen.

Umgebungskonfiguration:

  • mysql-installer-community-8.0.20.0

Problem: Wenn bei der Ausführung der Summenfunktion die Fensterfunktion doppelte Daten enthält, werden dieselben Daten direkt und nicht schrittweise hinzugefügt.

Problembeschreibung

Daten: In einer Notentabelle gibt es drei Felder: Studenten-ID, Kurs-ID, Notenscore.

Die Abfragebedingungen fragen die Bewertungsrangliste und die Bewertungszusammenfassung der Studenten für jeden Kurs ab.

Abfrageergebnis: Es wurde festgestellt, dass bei gleichen Punktzahlen für dieselbe Lehrveranstaltung die Gesamtpunktzahl nicht kumuliert, sondern auf einmal addiert wird.

Erstellen einer Datentabelle

CREATE TABLE `Punktzahl`(
`s_id` VARCHAR(20),
`c_id` VARCHAR(20),
`s_score` INT(3),
PRIMÄRSCHLÜSSEL(`s_id`,`c_id`)
)

Einfügen von Daten

-- in Score-Werte einfügen('01', '01', 80);
in Score-Werte einfügen('01', '02', 90);
in Score-Werte einfügen('01', '03', 99);
in Score-Werte einfügen('02', '01', 70);
in Score-Werte einfügen('02', '02', 60);
in Score-Werte einfügen('02', '03', 80);
in Score-Werte einfügen('03', '01', 80);
in Score-Werte einfügen('03', '02', 80);
einfügen in Score-Werte('03', '03', 80);
in Score-Werte einfügen('04', '01', 50);
in Score-Werte einfügen('04', '02', 30);
in Score-Werte einfügen('04', '03', 20);
in Score-Werte einfügen('05', '01', 76);
in Score-Werte einfügen('05', '02', 87);
in Score-Werte einfügen('06', '01', 31);
in Score-Werte einfügen('06', '03', 34);
in Score-Werte einfügen('07', '02', 89);
in Score-Werte einfügen('07', '03', 98);

Daten abfragen

Wählen Sie c_id, s_id, s_score,
first_value(s_score) über w als first_v,
last_value(s_score) über w als last_v,
Summe(s_score) über w als Summe_v,
max(s_score) über w als max_v,
min(s_score) über w als min_v,
count(s_id) über w als count_v,
row_number() über w als row_id,
rank() über w als rank_id,
dense_rank() über w als dense_id
aus dem Punktefenster war (Partition nach c_id, sortiert nach s_score, absteigend);

Abfrageergebnisse

Betrachtet man die statistischen Ergebnisse des Kurses Nr. 01, so betragen in der Spalte sum_v der ersten Datenzeile die ersten beiden Daten beide 160. Gemäß dem Funktionsprinzip sollten die Daten 80 und 160 betragen.

Wenn wir uns die statistischen Ergebnisse des Kurses Nr. 02 ansehen, stellen wir fest, dass die Ergebnisse korrekt sind. Die erste Summe_v beträgt 90 und die zweite 179.

Die tatsächliche Anzeige stimmt nicht mit dem erwarteten Ergebnis überein. Es ist ein Fehler aufgetreten.

c_id s_id s_score erste_v letzte_v Summe_v max_v min_v Anzahl_v Zeilen-ID Rang-ID dichte_id
01 01 80 80 80 160 80 80 2 1 1 1
01 03 80 80 80 160 80 80 2 2 1 1
01 05 76 80 76 236 80 76 3 3 3 2
01 02 70 80 70 306 80 70 4 4 4 3
01 04 50 80 50 356 80 50 5 5 5 4
01 06 31 80 31 387 80 31 6 6 6 5
02 01 90 90 90 90 90 90 1 1 1 1
02 07 89 90 89 179 90 89 2 2 2 2
02 05 87 90 87 266 90 87 3 3 3 3
02 03 80 90 80 346 90 80 4 4 4 4
02 02 60 90 60 406 90 60 5 5 5 5
02 04 30 90 30 436 90 30 6 6 6 6
03 01 99 99 99 99 99 99 1 1 1 1
03 07 98 99 98 197 99 98 2 2 2 2
03 02 80 99 80 357 99 80 4 3 3 3
03 03 80 99 80 357 99 80 4 4 3 3
03 06 34 99 34 391 99 34 5 5 5 4
03 04 20 99 20 411 99 20 6 6 6 5

Denken Überprüfung

Die Daten für Kursnummer 02 sind korrekt, die für 01 jedoch nicht. Der Unterschied zwischen 01 und 02 besteht darin, dass die ersten beiden Studierenden in Kurs 01 die gleiche Punktzahl von 80 haben.

Kann es sein, dass die Punktzahlen gleich waren und es dadurch zu einem Fehler bei der Addition kam?

Um dieses Problem zu überprüfen, ändern Sie die Punktzahl von Kursnummer 01 und Studentennummer 01 auf 82 und führen Sie dann die Abfrage aus. Das Ergebnis ist wie folgt

Die Spalte sum_v zeigt 82 und 162, was mit den erwarteten Ergebnissen übereinstimmt.

Dies zeigt, dass bei der Ausführung der Summenfunktion in Fällen, in denen doppelte Daten vorhanden sind, dieselben Daten direkt und nicht schrittweise hinzugefügt werden.


c_id s_id s_score erste_v letzte_v Summe_v max_v min_v Anzahl_v Zeilen-ID Rang-ID dichte_id
01 01 80 80 82 82 82 82 2 1 1 1
01 03 80 80 80 162 82 80 2 2 1 1
01 05 76 80 76 236 82 76 3 3 3 2
01 02 70 80 70 306 82 70 4 4 4 3
01 04 50 80 50 356 82 50 5 5 5 4
01 06 31 80 31 387 82 31 6 6 6 5
02 01 90 90 90 90 90 90 1 1 1 1
02 07 89 90 89 179 90 89 2 2 2 2
02 05 87 90 87 266 90 87 3 3 3 3
02 03 80 90 80 346 90 80 4 4 4 4
02 02 60 90 60 406 90 60 5 5 5 5
02 04 30 90 30 436 90 30 6 6 6 6
03 01 99 99 99 99 99 99 1 1 1 1
03 07 98 99 98 197 99 98 2 2 2 2
03 02 80 99 80 357 99 80 4 3 3 3
03 03 80 99 80 357 99 80 4 4 3 3
03 06 34 99 34 391 99 34 5 5 5 4
03 04 20 99 20 411 99 20 6 6 6 5

Andere SQL-Überprüfung und -Vergleich

Nach der obigen Überprüfung trat bei der Summierung in Mysql tatsächlich ein Fehler auf, der nicht schrittweise akkumuliert wurde.

Ich habe überprüft, ob das gleiche Problem auf anderen Plattformen in Sqlite Expert 5.3 besteht und habe die gleichen Ergebnisse gefunden.

Das ist merkwürdig. Wenn bei der Implementierung von MySQL ein Fehler auftritt, ist die Wahrscheinlichkeit, dass SQLite denselben Fehler macht, viel geringer.

Könnte es an den Eigenschaften der Summen- und Fensterfunktionen liegen, wenn sie zusammen verwendet werden? Herzlich willkommen zum gemeinsamen Diskutieren und Forschen.

Zusammenfassen

Dies ist das Ende dieses Artikels über einen möglichen Fehler bei der Ausführung der Summenfunktion von MySQL auf der Fensterfunktion. Weitere Informationen zur Ausführung der Summenfunktion von MySQL auf der Fensterfunktion finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • Detaillierte Erklärung des Unterschieds zwischen temporärer MySQL-Tabelle und Partitionstabelle
  • MySQL Best Practices: Grundlegende Arten von Partitionstabellen
  • Grundlegendes Einführungstutorial zu MySQL-Partitionstabellen
  • MySQL-Optimierungspartitionstabelle
  • Beheben Sie den Fehler beim Löschen von MySQL-Benutzern
  • Ein Fehler in MySQL existiert
  • CentOS-Installation PHP5.5+Redis+XDebug+Nginx+MySQL vollständiger Datensatz
  • Ein Leistungsfehler bei MySQL-Partitionstabellen

<<:  nginx löst das Problem der langsamen Bildanzeige und des unvollständigen Downloads

>>:  So implementieren Sie die autorisierte WeChat-Anmeldung elegant in einem Vue3-Projekt

Artikel empfehlen

Beispielcode für Text-Origami-Effekt mit CSS3

Vorwort In diesem Artikel erfahren Sie hauptsächl...

Suchmaschinenfreie Sammlung von Website-Einträgen

1: Anmeldeeingang der Baidu-Website Website: http:...

Ein einfaches Beispiel für eine gemeinsame MySQL-Tabellenabfrage

MySql verwendet verknüpfte Tabellenabfragen, die ...

Docker verwendet Supervisor zur Verwaltung von Prozessvorgängen

Ein Docker-Container startet beim Start beispiels...

Grafisches Beispiel für die Verwaltung von Datenträgerkontingenten unter Linux

Das Datenträgerkontingent ist die Speichergrenze ...

Kompilieren Sie CPP-Dateien mit G++ in Ubuntu

Als ich die CPP-Datei zum ersten Mal mit G++ komp...

Detaillierte Erklärung der React-Ereignisbindung

1. Was ist In react Anwendungen werden Ereignisna...

Vue realisiert den gesamten Prozess der Slider-Drag-Verifizierungsfunktion

Rendern Definieren Sie das Skelett, schreiben Sie...

Ausführliches Tutorial zu Installations- und Upgradeproblemen bei MySQL 5.7.30

Keil Da auf dem Computer eine relativ alte MySQL-...

Fragen zum Vorstellungsgespräch zu JS 9 Promise

Inhaltsverzeichnis 1. Mehrere .catch 2. Mehrere ....