Czy kolejność kolumn ma znaczenie w klauzuli group by?


85

Jeśli mam dwie kolumny, jedną o bardzo wysokiej liczności, a drugą o bardzo małej liczności (unikalna liczba wartości), czy ma znaczenie, w jakiej kolejności grupuję?

Oto przykład:

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

Czy są sytuacje, w których ma to znaczenie?


2
Zobacz także powiązany post: Kolejność grupowania MYSQL5 według ...
trcarden

Odpowiedzi:


74

Nie, kolejność nie ma znaczenia dla klauzuli GROUP BY.

MySQL i SQLite to jedyne znane mi bazy danych, które pozwalają na wybranie kolumn, które są pomijane w grupie przez (niestandardowe, nieprzenośne), ale ich kolejność również nie ma znaczenia.


27

SQL jest deklaratywny.

W takim przypadku powiedziałeś optymalizatorowi, w jaki sposób chcesz pogrupować dane, i opracowano, jak to zrobić.

Nie ocenia wiersz po wierszu (proceduralnie) i najpierw sprawdza jedną kolumnę

Najważniejsze znaczenie ma kolejność kolumn w odniesieniu do indeksów. col1, col2to nie to samo co col2, col1. W ogóle.


15
Ma to również znaczenie dla ORDER BY.
Vincent McNabb

12

Istnieje starsza, niestandardowa funkcja programu Microsoft SQL Server o nazwie ROLLUP. ROLLUP jest rozszerzeniem składni GROUP BY, a kiedy jest używana, kolejność kolumn GROUP BY określa, które kolumny powinny zostać zgrupowane w wyniku. ROLLUP jest jednak przestarzały. Standardową alternatywą SQL jest użycie zestawów grupujących, które jest obsługiwane przez SQL Server 2008 i nowsze wersje.


10

Ponieważ nie zostało to tutaj wspomniane. Powyższe odpowiedzi są poprawne, tzn. Kolejność kolumn po klauzuli „group by” nie wpłynie na poprawność zapytania (tj. Na sumę kwot).

Jednak kolejność pobieranych wierszy będzie się różnić w zależności od kolejności kolumn określonych po klauzuli „group by”. Na przykład rozważ tabelę Az następującymi wierszami:

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

SELECT *, SUM(Col3) FROM A GROUP BY Col2, Col1będzie pobierać wiersze uporządkowane według Col2kolejności rosnącej.

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

Teraz zmień kolejność kolumn w grupie według na Col1, Col2. Pobrane wiersze są sortowane rosnąco według Col1.

to znaczy 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

Uwaga: suma sumy (czyli poprawność zapytania) pozostaje dokładnie taka sama.


7
Ale jeśli nie zostanie użyta opcja „ORDER BY”, kolejność wierszy wybranych wyników jest i tak nieokreślona, ​​prawda? Dlatego nigdy nie powinieneś polegać na żadnej określonej kolejności wierszy, nawet jeśli w ogóle nie używasz GROUP BY.
avl_sweden

Zgadzając się z @avl_sweden, myślę, że odpowiedź powinna przynajmniej wskazywać, że to zachowanie jest specyficzne dla implementacji. Nie ma gwarancji, że nowsza (lub nawet ta sama) wersja serwera SQL nie spowoduje innej kolejności.
NobodysNightmare

2

Jeśli mam dwie kolumny, jedną o bardzo wysokiej liczności, a drugą o bardzo małej liczności (unikalna liczba wartości), czy ma znaczenie, w jakiej kolejności grupuję?

Zapytanie-1

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

Zapytanie-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;

Oba są równe, kolejność nie działa w klauzuli grupa po.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.