it-swarm.com.de

Ist die Reihenfolge der Spalten in einer Gruppe durch Klausel von Bedeutung?

Wenn ich zwei Spalten habe, eine mit sehr hoher Kardinalität und eine mit sehr niedriger Kardinalität (eindeutige Anzahl von Werten), spielt es dann eine Rolle, in welcher Reihenfolge ich sie gruppiere?

Hier ist ein Beispiel:

select 
     dimensionName, 
     dimensionCategory, 
     sum(someFact)
from SomeFact f
join SomeDim d on f.dimensionKey = d.dimensionKey
group by 
    d.dimensionName,  -- large number of unique values
    d.dimensionCategory -- small number of unique values

Gibt es Situationen, in denen es wichtig ist?

63

Nein, die Reihenfolge spielt für die GROUP BY-Klausel keine Rolle.

MySQL und SQLite sind die einzigen Datenbanken, von denen ich weiß, dass Sie Spalten auswählen können, die nicht in der Gruppe enthalten sind (nicht standardisiert, nicht portabel), aber die Reihenfolge spielt auch keine Rolle.

56
OMG Ponies

SQL ist deklarativ.

In diesem Fall haben Sie dem Optimierer mitgeteilt, wie die Daten gruppiert werden sollen, und es wird geklärt, wie dies geschieht.

Es wird nicht Zeile für Zeile (prozedural) ausgewertet und zuerst eine Spalte betrachtet

Die Reihenfolge der Hauptspaltenspalten ist für Indizes. col1, col2 stimmt nicht mit col2, col1 überein. Überhaupt.

21
gbn

Es gibt eine ältere, nicht standardmäßige Funktion von Microsoft SQL Server mit dem Namen ROLLUP. ROLLUP ist eine Erweiterung der GROUP BY-Syntax. Wenn sie verwendet wird, bestimmt die Reihenfolge der GROUP BY-Spalten, welche Spalten im Ergebnis gruppiert werden sollen. ROLLUP ist jedoch veraltet. Die Standard-SQL-Alternative besteht in der Verwendung von Gruppierungssätzen, die von SQL Server 2008 und höheren Versionen unterstützt werden.

10
nvogel

Da wurde hier nicht erwähnt. Die obigen Antworten sind korrekt, d. H. Die Reihenfolge der Spalten nach der Klausel "Gruppieren nach" beeinflusst nicht die Korrektheit der Abfrage (d.

Die Reihenfolge der abgerufenen Zeilen hängt jedoch von der Reihenfolge der nach der Klausel "group by" angegebenen Spalten ab. Betrachten Sie beispielsweise die Tabelle A mit den folgenden Zeilen:

Col1 Col2 Col3
1   xyz 100
2   abc 200
3   xyz 300
3   xyz 400

SELECT *, SUM(Col3) FROM A GROUP BY Col2, Col1 ruft Zeilen ab, die nach Col2 in aufsteigender Reihenfolge geordnet sind.

Col1 Col2 Col3 sum(Col3)
2   abc 200 200
1   xyz 100 100
3   xyz 300 700

Ändern Sie nun die Reihenfolge der Spalten in der Gruppe in Col1, Col2. Die abgerufenen Zeilen sind nach Col1 aufsteigend sortiert. 

d.h. select *, sum(Col3) from A group by Col1, Col2

Col1 Col2 Col3 sum(Col3)
1   xyz 100 100
2   abc 200 200
3   xyz 300 700

Hinweis: Der Summenbetrag (d. H. Die Richtigkeit der Abfrage) bleibt genau gleich.

5
AaCodes

Wenn ich zwei Spalten habe, eine mit sehr hoher Kardinalität und eine mit sehr niedriger Kardinalität (eindeutige Anzahl von Werten), spielt es dann eine Rolle, in welcher Reihenfolge ich sie gruppiere?

Abfrage-1

SELECT spec_id, catid, spec_display_value, COUNT(*) AS cnt  FROM tbl_product_spec 
GROUP BY spec_id, catid, spec_display_value ;

Abfrage-2

SELECT spec_id, catid, spec_display_value, COUNT(*) AS cnt  FROM tbl_product_spec FORCE INDEX(idx_comp_spec_cnt)
GROUP BY catid, spec_id,spec_display_value;

Beide sind gleich, Ordnung funktioniert nicht in Klausel.

0
Gauravk