In SQL-Abfragen verwenden wir die Group by-Klausel, um Aggregatfunktionen anzuwenden.

  • Aber wozu dient die Verwendung eines numerischen Werts anstelle eines Spaltennamens mit der Group by-Klausel? Beispiel: Gruppieren nach 1.

Kommentare

  • Verwenden Sie order by 1 nur im Sitzen an der Eingabeaufforderung mysql> . Verwenden Sie im Code ORDER BY id ASC. Beachten Sie den Fall, den expliziten Feldnamen und die explizite Bestellrichtung.

Antwort

Dies ist tatsächlich eine wirklich schlechte IMHO zu tun, und es wird in den meisten anderen Datenbankplattformen nicht unterstützt.

Die Gründe, warum Leute es tun:

  • sie sind faul – Ich weiß nicht, warum die Leute glauben, dass ihre Produktivität durch das Schreiben von knappem Code verbessert wird, anstatt zusätzliche 40 Millisekunden zu tippen, um viel mehr wörtlichen Code zu erhalten.

Die Gründe, warum es schlecht ist:

  • es ist nicht selbstdokumentierend – Jemand muss die SELECT-Liste analysieren, um die Gruppierung herauszufinden. In SQL Server, das Cowboy nicht unterstützt, ist dies tatsächlich etwas klarer. weiß, was passieren wird Gruppierung wie MySQL.

  • es ist spröde – jemand kommt herein und ändert die SELECT-Liste, weil Die Geschäftsbenutzer wollten eine andere Berichtsausgabe, und jetzt ist Ihre Ausgabe ein Chaos. Wenn Sie Spaltennamen in GROUP BY verwendet hätten, wäre die Reihenfolge in der SELECT-Liste irrelevant.

SQL Server unterstützt ORDER BY [ordinal]; Hier sind einige parallele Argumente gegen seine Verwendung:

Antwort

Mit MySQL können Sie GROUP BY mit Aliasen ( Probleme mit Spaltenaliasen ). Dies wäre weitaus besser, als GROUP BY mit Zahlen zu tun.

Google hat viele Beispiele für die Verwendung und warum viele die Verwendung eingestellt haben.

Um ehrlich zu sein, habe ich keine Spaltennummern für ORDER BY und verwendet GROUP BY seit 1996 (ich habe damals Oracle PL / SQL-Entwicklung durchgeführt). Die Verwendung von Spaltennummern ist wirklich für Oldtimer gedacht, und die Abwärtskompatibilität ermöglicht solchen Entwicklern, MySQL und andere RDBMS zu verwenden, die Lassen Sie es immer noch zu.

Antwort

Betrachten Sie den folgenden Fall:

+------------+--------------+-----------+ | date | services | downloads | +------------+--------------+-----------+ | 2016-05-31 | Apps | 1 | | 2016-05-31 | Applications | 1 | | 2016-05-31 | Applications | 1 | | 2016-05-31 | Apps | 1 | | 2016-05-31 | Videos | 1 | | 2016-05-31 | Videos | 1 | | 2016-06-01 | Apps | 3 | | 2016-06-01 | Applications | 4 | | 2016-06-01 | Videos | 2 | | 2016-06-01 | Apps | 2 | +------------+--------------+-----------+ 

Sie müssen die Anzahl der Downloads pro Dienst und Tag ermitteln, indem Sie Apps und Anwendungen als denselben Dienst betrachten. Eine Gruppierung nach date, services würde dazu führen, dass Apps und Applications als separate Dienste betrachtet werden.

In diesem Fall lautet die Abfrage:

 select date, services, sum(downloads) as downloads from test.zvijay_test group by date,services 

und Ausgabe:

+------------+--------------+-----------+ | date | services | downloads | +------------+--------------+-----------+ | 2016-05-31 | Applications | 2 | | 2016-05-31 | Apps | 2 | | 2016-05-31 | Videos | 2 | | 2016-06-01 | Applications | 4 | | 2016-06-01 | Apps | 5 | | 2016-06-01 | Videos | 2 | +------------+--------------+-----------+ 

Dies ist jedoch nicht das, was Sie möchten, da die Gruppierung von Anwendungen und Apps erforderlich ist. Was können wir also tun?

Eine Möglichkeit besteht darin, Apps durch Applications durch eine Ausdruck oder die Funktion IF und gruppieren sie dann über Dienste wie folgt:

select date, if(services="Apps","Applications",services) as services, sum(downloads) as downloads from test.zvijay_test group by date,services 

Dies gruppiert jedoch weiterhin Dienste, die Apps und Applications als unterschiedliche Dienste betrachten, und gibt dieselbe Ausgabe wie zuvor aus:

+------------+--------------+-----------+ | date | services | downloads | +------------+--------------+-----------+ | 2016-05-31 | Applications | 2 | | 2016-05-31 | Applications | 2 | | 2016-05-31 | Videos | 2 | | 2016-06-01 | Applications | 4 | | 2016-06-01 | Applications | 5 | | 2016-06-01 | Videos | 2 | +------------+--------------+-----------+ 

Durch Gruppieren über eine Spaltennummer können Sie Daten in einer Alias-Spalte gruppieren.

select date, if(services="Apps","Applications",services) as services, sum(downloads) as downloads from test.zvijay_test group by date,2; 

Und so erhalten Sie die gewünschte Ausgabe wie folgt:

+------------+--------------+-----------+ | date | services | downloads | +------------+--------------+-----------+ | 2016-05-31 | Applications | 4 | | 2016-05-31 | Videos | 2 | | 2016-06-01 | Applications | 9 | | 2016-06-01 | Videos | 2 | +------------+--------------+-----------+ 

Ich habe Lesen Sie oft, dass dies eine verzögerte Methode zum Schreiben von Abfragen oder zum Gruppieren über eine Alias-Spalte ist. Dies funktioniert in MySQL nicht. Dies ist jedoch die Methode zum Gruppieren über Alias-Spalten.

Dies ist nicht die bevorzugte Methode zum Schreiben von Abfragen. Verwenden Sie sie nur, wenn Sie müssen wirklich über einer Alias-Spalte gruppieren.

Kommentare

  • Dies gruppiert jedoch weiterhin Dienste, die Apps und Anwendungen als unterschiedliche Dienste betrachten, und liefert dieselbe Ausgabe wie zuvor „.Wäre ‚ nicht zu lösen, wenn Sie ‚ einen anderen (nicht widersprüchlichen) Namen für den Alias gewählt hätten?
  • @ Daddy32 Genau mein Gedanke. Oder verschachteln Sie noch einmal (Gruppe nach Auswahl)

Antwort

Es gibt keinen gültigen Grund, es zu verwenden. Es ist einfach eine faule Verknüpfung, die speziell entwickelt wurde, um es einem hartnäckigen Entwickler zu erschweren, Ihre Gruppierung oder Sortierung später herauszufinden, oder um zuzulassen, dass der Code kläglich fehlschlägt, wenn jemand die Spaltenreihenfolge ändert. Seien Sie rücksichtsvoll gegenüber Ihren Entwicklerkollegen und tun Sie es nicht.

Antwort

Dies funktioniert für mich. Der Code gruppiert die Zeilen mit bis zu 5 Gruppen.

SELECT USR.UID, USR.PROFILENAME, ( CASE WHEN MOD(@curRow, 5) = 0 AND @curRow > 0 THEN @curRow := 0 ELSE @curRow := @curRow + 1 /*@curRow := 1*/ /*AND @curCode := USR.UID*/ END ) AS sort_by_total FROM SS_USR_USERS USR, ( SELECT @curRow := 0, @curCode := "" ) rt ORDER BY USR.PROFILENAME, USR.UID 

Das Ergebnis lautet wie folgt:

Geben Sie hier die Bildbeschreibung ein.

Antwort

SELECT dep_month,dep_day_of_week,dep_date,COUNT(*) AS flight_count FROM flights GROUP BY 1,2; SELECT dep_month,dep_day_of_week,dep_date,COUNT(*) AS flight_count FROM flights GROUP BY 1,2,3; 

Betrachten Sie die obigen Abfragen: Gruppieren nach 1 bedeutet Gruppieren nach der ersten Spalte und Gruppieren nach 1,2 bedeutet Gruppieren nach der ersten und zweiten Spalte und Gruppieren nach 1,2,3 bedeutet Gruppieren für die erste zweite und dritte Spalte. Zum Beispiel:

Gruppe nach 1,2

Dieses Bild zeigt die ersten beiden Spalten, gruppiert nach 1,2, dh es werden die unterschiedlichen Werte von dep_date nicht berücksichtigt, um die Anzahl zu ermitteln (um die Anzahl zu berechnen, werden alle unterschiedlichen Kombinationen der ersten beiden Spalten berücksichtigt). wohingegen die zweite Abfrage dieses gruppieren nach 1,2,3

Bild. Hier werden alle ersten drei Spalten und dort unterschiedliche Werte berücksichtigt, um die Anzahl zu ermitteln, dh es wird nach allen ersten drei Spalten gruppiert (um die Anzahl zu berechnen, werden alle unterschiedlichen Kombinationen der ersten drei Spalten berücksichtigt).

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.