Подтвердить что ты не робот

Соответствует ли порядок столбцов в группе по статье?

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

Вот пример:

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

Есть ли ситуации, в которых это имеет значение?

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Основной порядок столбцов столбцов имеет значение для индексов. col1, col2 не совпадает с col2, col1. На всех.

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

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