Чи має значення порядок стовпців у групі за реченням?


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 порядок групи за ...
trcarden

Відповіді:


74

Ні, порядок не має значення для речення GROUP BY.

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


27

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

У цьому випадку ви сказали оптимізатору, як потрібно згрупувати дані, і з’ясовується, як це зробити.

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

Основне місце порядку стовпців має значення для індексів. col1, col2не те саме, що col2, col1. Зовсім.


15
Це також має значення ЗАМОВИТИ ПО.
Вінсент Мак-Набб

12

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


10

Оскільки про це тут не згадувалося. Відповіді вище є правильними, тобто порядок стовпців після пункту "групувати за" не вплине на правильність запиту (тобто сума суми).

Однак порядок отримання рядків буде змінюватися залежно від порядку стовпців, вказаних після речення "групувати". Наприклад, розглянемо таблицю 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.