Имеет ли значение порядок столбцов в предложении 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
есть ли ситуации, когда это имеет значение?
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, Col2Col1 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