A ordem das colunas importa em uma cláusula group by?

85

Se eu tiver duas colunas, uma com cardinalidade muito alta e outra com cardinalidade muito baixa (número único de valores), faz diferença em que ordem eu agrupo?

Aqui está um exemplo:

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

Existem situações em que é importante?

Jeff Meatball Yang
fonte
2
Veja também o post relacionado: Ordem do grupo
MYSQL5

Respostas:

74

Não, a ordem não importa para a cláusula GROUP BY.

MySQL e SQLite são os únicos bancos de dados que conheço que permitem selecionar colunas que são omitidas do grupo por (não padrão, não portátil), mas a ordem também não importa.

Pôneis OMG
fonte
27

SQL é declarativo.

Nesse caso, você disse ao otimizador como deseja que os dados sejam agrupados e ele sabe como fazer isso.

Ele não avaliará linha por linha (procedural) e olhará para uma coluna primeiro

O principal lugar que a ordem das colunas importa são os índices. col1, col2não é o mesmo que col2, col1. Em absoluto.

gbn
fonte
15
Também é importante para ORDER BY.
Vincent McNabb
12

Existe um recurso legado e não padrão do Microsoft SQL Server chamado ROLLUP. ROLLUP é uma extensão da sintaxe GROUP BY e, quando usada, a ordem das colunas GROUP BY determina quais colunas devem ser agrupadas no resultado. ROLLUP está obsoleto no entanto. A alternativa do SQL padrão é usar conjuntos de agrupamento, que são suportados pelo SQL Server 2008 e versões posteriores.

nvogel
fonte
10

Uma vez que isso não foi mencionado aqui. As respostas acima estão corretas, ou seja, a ordem das colunas após a cláusula "agrupar por" não afetará a exatidão da consulta (ou seja, o valor da soma).

No entanto, a ordem das linhas que estão sendo recuperadas variará com base na ordem das colunas especificadas após a cláusula "agrupar por". Por exemplo, considere a Tabela Acom as seguintes linhas:

Col1 Col2 Col3
1   xyz 100
2   abc 200
3   xyz 300
3   xyz 400

SELECT *, SUM(Col3) FROM A GROUP BY Col2, Col1irá recuperar as linhas ordenadas por Col2ordem crescente.

Col1 Col2 Col3 sum(Col3)
2   abc 200 200
1   xyz 100 100
3   xyz 300 700

Agora mude a ordem da coluna no grupo por para Col1, Col2. As linhas recuperadas são ordenadas asc por Col1.

ie 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

Nota: O valor da soma (ou seja, a exatidão da consulta) permanece exatamente o mesmo.

AaCodes
fonte
7
Mas, a menos que um "ORDER BY" seja usado, a ordem das linhas dos resultados selecionados é indefinida de qualquer maneira, não é? Portanto, você nunca deve confiar em nenhuma ordem particular de linhas, mesmo que não use GROUP BY.
avl_sweden
Concordando com @avl_sweden, acho que a resposta deve, no mínimo, indicar que esse comportamento é específico da implementação. Não há garantia de que uma versão mais recente (ou mesmo a mesma) do servidor SQL não produzirá uma ordem diferente.
NobodysNightmare
2

Se eu tiver duas colunas, uma com cardinalidade muito alta e outra com cardinalidade muito baixa (número único de valores), faz diferença em que ordem eu agrupo?

Query-1

SELECT spec_id, catid, spec_display_value, COUNT(*) AS cnt  FROM tbl_product_spec 
GROUP BY spec_id, catid, spec_display_value ;

Query-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;

Ambos são iguais, a ordem não funciona em grupo por cláusula.

Gauravk
fonte