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



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



вот пример:



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


есть ли ситуации, когда это имеет значение?

760   5  

5 ответов:

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

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

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

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

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

главное место порядок столбцов имеет значение для индексов. col1, col2 - Это не то же самое как col2, col1. Совсем.

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

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

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;

оба равны, порядок не работает в предложении group by.

Comments

    Ничего не найдено.