Являются ли поля SQL GROUP BY коммутативными во всех случаях?
В простом запросе порядок полей GROUP BY не имеет значения (игнорируя разборчивость разработчика) до конечного результата.
EG: SELECT COUNT(*) FROM People GROUP BY Age, Gender
выдаст те же результаты, что и поля GROUP BY.
Вообще говоря, при каких условиях (s) это кажущееся коммутативное свойство полей GROUP BY ломается?
Я ищу здесь общее правило (EG: "Любое выражение, содержащее подвыражения, зависящие от одного из сгруппированных полей" )
Мне нелегко придумать пример того, где будет иметь дело заказ, но моя кишка говорит мне, что это происходит в некоторых ситуациях.
Ответы
Ответ 1
Я думаю, что единственный раз, когда это имеет значение, это использование ROLLUP для создания промежуточных результатов
http://msdn.microsoft.com/en-us/library/ms189305(v=sql.90).aspx
CREATE TABLE #Prod
(
ID INT IDENTITY(1,1),
Cat INT,
Size Int
)
INSERT #Prod SELECT 1,1
INSERT #Prod SELECT 1,1
INSERT #Prod SELECT 1,2
INSERT #Prod SELECT 1,3
INSERT #Prod SELECT 1,3
INSERT #Prod SELECT 1,3
INSERT #Prod SELECT 2,1
INSERT #Prod SELECT 2,2
INSERT #Prod SELECT 2,2
INSERT #Prod SELECT 2,3
INSERT #Prod SELECT 2,3
INSERT #Prod SELECT 2,3
SELECT
COUNT(*)
FROM #Prod
GROUP BY Cat, Size WITH ROLLUP
SELECT
COUNT(*)
FROM #Prod
GROUP BY Size , Cat WITH ROLLUP
Результаты запроса 1
2
1
3
6
1
2
3
6
12
(затронуто 9 строк (строк))
Результаты запроса 2
2
1
3
1
2
3
3
3
6
12
(затронуто 10 строк)
Ответ 2
Я только размышляю здесь, но возможно, что если кто-то реализует агрегированные функции на основе CLR, это будет иметь значение. Я реализовал агрегированную функцию раньше в С#, и у меня есть это ощущение, что в зависимости от того, что происходит на самом деле, возможно, что порядок группы может повлиять на нее.
Я не знаю достаточно о том, как агрегированные функции CLR взаимодействуют с движком, чтобы действительно сказать что-то большее:/
Ответ 3
NEW!!!
Итак... это возможно при использовании наборов группировок, порядок может иметь значение; я должен был бы провести некоторое тестирование.
--- OLD yeah ORDER < > Group.
Учитывая:
Select val, text2 from b
order by text2, val;
РЕЗУЛЬТАТ:
Val text2
4 XXX010103
1 XXX010105
1 something XXX010101 something else XXX010102
2 yet another XXX010102 and this XXX010103
vs:
Select val, text2 from b
order by val,text2;
val text2
1 XXX010105
1 something XXX010101 something else XXX010102
2 yet another XXX010102 and this XXX010103
4 XXX010103
разный порядок показывает другой вид; но, возможно, речь идет не о порядке, а о подмножестве: и снова да порядок имеет значение в разных подмножествах:
Imagine select top 1 from table order by val vs select top 1 from table order by val desc;
Ответ 4
Мне нравится ваш вопрос:)
Я думаю, что в случае, когда вы указываете, где вы делаете подсчеты (что является чисто аддитивным), порядок группировки не имеет значения. Добавление является коммутативным, и GROUP BY не должно удалять любые строки из набора, он просто сводит их к отображению. Поэтому не должно быть никакого значения, какой порядок вы их группируете.