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?
sql
sql-server
group-by
Jeff Meatball Yang
źródło
źródło
Odpowiedzi:
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.
źródło
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, col2
to nie to samo cocol2, col1
. W ogóle.źródło
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.
źródło
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ę
A
z następującymi wierszami:SELECT *, SUM(Col3) FROM A GROUP BY Col2, Col1
będzie pobierać wiersze uporządkowane wedługCol2
kolejności rosnącej.Teraz zmień kolejność kolumn w grupie według na
Col1, Col2
. Pobrane wiersze są sortowane rosnąco wedługCol1
.to znaczy
select *, sum(Col3) from A group by Col1, Col2
Uwaga: suma sumy (czyli poprawność zapytania) pozostaje dokładnie taka sama.
źródło
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.
źródło