Ich habe vor Kurzem eine Reihe statistischer Funktionen zum Backend einer bestimmten Website hinzugefügt und bin dabei auf viele Situationen gestoßen, in denen ein Zählen nach Bedingungen erforderlich war. Ich habe mehrere Methoden ausprobiert und sie unten zu Ihrer Information kurz aufgezeichnet. Problembeschreibung Um die Diskussion verständlicher zu machen, habe ich das Problem etwas vereinfacht und viele Hintergründe entfernt. Es war einmal ein Kaiser, der hatte 50 Konkubinen. Diese Konkubinen gebar ihm zu Unrecht 100.000 Söhne. Der Kaiser war sehr verzweifelt. Es war schwierig, eine so große Zahl von Söhnen zu verwalten. Außerdem wollte er wissen, wie viele Söhne jede Konkubine geboren hatte, damit er sie entsprechend ihrer Verdienste belohnen konnte. Dies war sehr schwierig. Also stellte der Kaiser einen Programmierer ein, der ihm helfen sollte, ein Programm zu schreiben, mit dem die Informationen aller seiner Söhne in einer Datenbank gespeichert werden konnten, sodass er sie mit dem Programm zählen und verwalten konnte. Die Datenbank hat folgende Struktur:
Der Kaiser teilte seine Konkubinen in zwei Ebenen ein: die Konkubinen im Himmlischen Palast (Anzahl kleiner als 25) und die Konkubinen im Unterirdischen Palast (Anzahl größer oder gleich 25). Er wollte wissen, welche von ihnen fruchtbarer war, die Konkubinen im Himmlischen Palast oder die Konkubinen im Unterirdischen Palast. Also begannen Programmierer, SQL-Abfragen zu schreiben. Methode 1: Verwenden von GROUP BY SQL-Abfrage Ausführungsergebnisse
Laufzeit bei 100.000 Zeilen: 0,0335 Sekunden analysieren Das größte Problem bei diesem GROUP BY-Ansatz besteht darin, dass es unmöglich ist, die erzielten Ergebnisse zu unterscheiden. Welche dieser beiden Zahlen ist die Anzahl der Prinzen, die den Damen im Himmlischen Palast geboren wurden, und welche ist die Anzahl der Prinzen, die den Damen im Unterirdischen Palast geboren wurden? habe keine Ahnung. Obwohl es also eine Gesamtsumme ergibt, ist es bedeutungslos. Um die statistischen Ergebnisse unterscheiden zu können, muss die Bedingung „Mutter > 24“ daher auch als Feld im Ergebnissatz wiedergegeben werden. Das modifizierte SQL lautet wie folgt: Ausführungsergebnisse
Wenn der bedingte Ausdruck als Feld verwendet wird, ist der Wert des Felds der Wert des bedingten Ausdrucks. Daher bedeutet in unserem Beispiel Typ = 1, dass der Wert von Mutter > 24 1 ist. Daher stellen die Zahlen in der zweiten Zeile die Anzahl der Prinzen dar, die den Damen im unterirdischen Palast geboren wurden. Nach den Änderungen können wir sehen, dass die Göttinnen im himmlischen Palast etwas besser sind. Für und Wider Die Nachteile liegen auf der Hand. Da bedingte Ausdrücke als Grundlage für die Gruppierung verwendet werden, können nur binäre Unterteilungen vorgenommen werden. Dies ist nicht für Situationen geeignet, in denen mehrere Kategorien aus statistischen Gründen unterteilt werden müssen. Beispielsweise wäre es unmöglich, die Anzahl der Kinder zu zählen, die von den Konkubinen Nr. 1 bis 10, Nr. 11 bis 24 und Nr. 25 bis 50 geboren wurden. Da GROUP BY verwendet wird, ist außerdem eine Sortierung erforderlich und die Ausführungszeit ist länger. Ich habe bei diesem Ansatz bisher keine Vorteile entdeckt. Methode 2: Verwenden von verschachtelten SELECT Das Ziel kann auch durch die Verwendung verschachtelter SELECTs erreicht werden, indem die Daten unter einer Bedingung in jeder SELECT-Klausel gezählt werden und diese statistischen Daten dann in ein Haupt-SELECT integriert werden. SQL-Abfrage WÄHLEN ( SELECT COUNT( * ) FROM `Prinz` WHERE `Mutter` >24 ) AS `Digong`, ( SELECT COUNT( * ) FROM ‚Prinz‘ WHERE ‚Mutter‘ <=24 ) AS ‚tiangong‘ Ausführungsergebnisse
Laufzeit bei 100.000 Zeilen: 0,0216 Sekunden analysieren Diese verschachtelte SELECT-Methode ist sehr intuitiv. Sie zählt die Werte unter jeder Bedingung separat und fasst sie am Ende zusammen. Sie ist leicht zu verstehen und unterscheidet sich nicht von natürlicher Sprache. Für und Wider Der Vorteil ist, dass es intuitiv und schneller als GROUP BY ist. Obwohl es drei SELECT-Anweisungen gibt, also zwei mehr als bei der GROUP BY-Lösung, erfolgt keine Sortierung, was viel Zeit spart. Der Nachteil kann darin bestehen, dass es zu viele Sätze gibt, und Schüler, die von der Anzahl der Sätze besessen sind, fühlen sich möglicherweise unwohl. Methode 3: Verwenden von CASE WHEN Die CASE WHEN-Anweisung ist sehr leistungsfähig und kann flexible Abfragebedingungen definieren, weshalb sie sich sehr gut für Klassifizierungsstatistiken eignet. SQL-Abfrage WÄHLEN ZÄHLEN (FALL, WENN „Mutter“ >24, DANN 1, SONST NULL, ENDE) ALS „Digong“, ZÄHLEN (FALL, WENN „Mutter“ <= 24, DANN 1, SONST NULL, ENDE) ALS „tiangong“ VON Prinz Ausführungsergebnisse
Laufzeit für 100.000 Zeilen: 0,02365825 Sekunden analysieren Der Schlüssel zu dieser Methode ist Hier werden COUNT und CASE WHEN zusammen verwendet, um kategorisches Zählen zu erreichen. Verwenden Sie zunächst CASE WHEN. Wenn die Bedingung erfüllt ist, setzen Sie den Feldwert auf 1. Wenn die Bedingung nicht erfüllt ist, setzen Sie den Feldwert auf NULL. Dann zählt die Funktion COUNT nur noch Felder, die nicht NULL sind. Dann ist das Problem gelöst. Für und Wider Der Vorteil dieser Methode besteht darin, dass keine Sortierung erforderlich ist. Die Ausführungszeit ist daher mit der von Methode 2 vergleichbar und die Anzahl der SELECT-Anweisungen wird auf 1 reduziert. Der Nachteil besteht darin, dass die Sätze relativ lang sind und sich Schüler, die auf die Satzlänge fixiert sind, möglicherweise unwohl fühlen. Zusammenfassen Versuchen Sie beim bedingten Zählen bestimmter Kategorien, GROUP BY nicht zu verwenden, um das Sortieren zu vermeiden und die Ausführung der Abfrage zu beschleunigen. Wenn Sie basierend auf dem Wert eines Felds klassifizieren müssen und der Wert des Felds variabel ist, möchte der Kaiser beispielsweise die Anzahl der Kinder zählen, die jede Konkubine zur Welt bringt, und er heiratet möglicherweise viele Konkubinen. In diesem Fall ist die Verwendung der Methoden 2 und 3 nicht sehr effektiv. Einfacher und bequemer ist die Verwendung von GROUP BY. Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird. Das könnte Sie auch interessieren:
|
<<: Detailliertes Tutorial zur Installation von InfluxDB in Docker (Leistungstest)
Vorwort Während des Entwicklungsprozesses werden ...
Vorwort Da immer wieder Fehler auftreten, protoko...
Vorne geschrieben Ich weiß nicht, wer als Erster ...
Ich glaube, jeder hat schon einmal Rubbellose ges...
# Die folgenden Beispiele gelten für die x64-Bit-...
<!--[if IE 6]> Nur IE6 kann erkennen <![e...
Inhaltsverzeichnis Namespaces mit gleichem Namen ...
Das grafische Tutorial zur Installation und Konfi...
Die Fallstricke der Lese- und Schreibtrennung in ...
Vorwort Lernen Sie MySQL, um frühere Nicht-MK-Dat...
Verwenden Sie Javascript, um eine feste Seitenlei...
Erstellen Sie zunächst einen Tomcat-Ordner. Um di...
Inhaltsverzeichnis 1. Hintergrundwissen 1. Einfüh...
Der <area>-Tag definiert einen Bereich in e...