Имеет ли значение порядок столбцов в предложении group by?


85

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

Вот пример:

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

Есть ли ситуации, когда это важно?


2
См. Также связанный пост: Порядок группировки
MYSQL5

Ответы:


74

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

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


27

SQL декларативен.

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

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

Порядок расположения столбцов в основном имеет значение для индексов. col1, col2не то же самое, что col2, col1. Вообще.


15
Это также имеет значение для ORDER BY.
Винсент Макнабб

12

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


10

Поскольку об этом здесь не упоминалось. Вышеуказанные ответы верны, т. Е. Порядок столбцов после предложения «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

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


7
Но если не используется «ORDER BY», порядок строк результатов выбора все равно не определен, не так ли? Таким образом, вы никогда не должны полагаться на какой-либо конкретный порядок строк, даже если вообще не используете GROUP BY.
avl_sweden

Соглашаясь с @avl_sweden, я думаю, что ответ должен как минимум указывать на то, что это поведение зависит от реализации. Нет никакой гарантии, что более новая (или даже такая же) версия SQL-сервера не создаст другой порядок.
NobodysNightmare

2

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

Запрос-1

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

Запрос-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;

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.