Имеет ли значение порядок столбцов в выражении group by? - PullRequest
69 голосов
/ 17 июня 2010

Если у меня есть два столбца, один с очень высокой кардинальностью и один с очень низкой кардинальностью (уникальное число значений), имеет ли значение, в каком порядке я группируюсь по?

Вот пример:

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

Существуют ли ситуации, когда это имеет значение?

Ответы [ 5 ]

60 голосов
/ 17 июня 2010

Нет, порядок не имеет значения для предложения GROUP BY.

MySQL и SQLite - единственные базы данных, о которых я знаю, которые позволяют вам выбирать столбцы, которые исключены из группы (не-стандартный, не переносимый) но порядок там тоже не имеет значения.

23 голосов
/ 17 июня 2010

SQL является декларативным.

В этом случае вы сообщили оптимизатору, как вы хотите сгруппировать данные, и он выяснит, как это сделать.

Он не будет оценивать построчнострока (процедурная) и сначала посмотрите на один столбец

Порядок столбцов основного места имеет значение для индексов.col1, col2 - это не то же самое, что col2, col1.На всех.

11 голосов
/ 18 июня 2010

Существует устаревшая, нестандартная функция Microsoft SQL Server, которая называется ROLLUP. ROLLUP является расширением синтаксиса GROUP BY, и при его использовании порядок столбцов GROUP BY определяет, какие столбцы следует сгруппировать в результате. ROLLUP устарела как бы то ни было. Стандартной альтернативой SQL является использование группирующих наборов, что поддерживается SQL Server 2008 и более поздними версиями.

7 голосов
/ 01 сентября 2016

Так как это не было упомянуто здесь. Приведенные выше ответы являются правильными, то есть порядок столбцов после предложения «group by» не повлияет на правильность запроса (то есть сумму суммы).

Однако порядок извлечения строк будет варьироваться в зависимости от порядка столбцов, указанных после предложения «group by». Например, рассмотрим таблицу A со следующими строками:

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

SELECT *, SUM(Col3) FROM A GROUP BY Col2, Col1 будет извлекать строки, упорядоченные по Col2 в порядке возрастания.

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

Теперь измените порядок столбцов в группе на Col1, Col2. Полученные строки упорядочены по возрастанию Col1.

т.е. 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

Примечание. Сумма суммирования (т. Е. Правильность запроса) остается неизменной.

1 голос
/ 12 июня 2017

Если у меня есть два столбца, один с очень высокой кардинальностью и один с очень низкой кардинальностью (уникальное число значений), имеет ли значение, в каком порядке я группируюсь по?

Query-1

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

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

Оба равны, порядок не работает в группе по предложению.

...