¿Importa el orden de las columnas en una cláusula group by?

85

Si tengo dos columnas, una con cardinalidad muy alta y otra con cardinalidad muy baja (número único de valores), ¿importa en qué orden agrupe?

He aquí un ejemplo:

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

¿Hay situaciones en las que importa?

Jeff Albóndiga Yang
fuente
2
Vea también la publicación relacionada: orden de grupo
MYSQL5

Respuestas:

74

No, el orden no importa para la cláusula GROUP BY.

MySQL y SQLite son las únicas bases de datos que conozco que le permiten seleccionar columnas que se omiten del grupo por (no estándar, no portátil) pero el orden tampoco importa allí.

Ponis dios mio
fuente
27

SQL es declarativo.

En este caso, le ha dicho al optimizador cómo desea que se agrupen los datos y éste resuelve cómo hacerlo.

No evaluará línea por línea (procedimiento) y verá una columna primero

El orden de las columnas del lugar principal es para los índices. col1, col2no es lo mismo que col2, col1. En absoluto.

gbn
fuente
15
También es importante para ORDER BY.
Vincent McNabb
12

Existe una característica heredada y no estándar de Microsoft SQL Server llamada ROLLUP. ROLLUP es una extensión de la sintaxis GROUP BY y cuando se usa, el orden de las columnas GROUP BY determina qué columnas deben agruparse en el resultado. Sin embargo, ROLLUP está en desuso. La alternativa estándar de SQL es utilizar conjuntos de agrupación, que es compatible con SQL Server 2008 y versiones posteriores.

nvogel
fuente
10

Dado que esto no se ha mencionado aquí. Las respuestas anteriores son correctas, es decir, el orden de las columnas después de la cláusula "agrupar por" no afectará la exactitud de la consulta (es decir, el monto total).

Sin embargo, el orden de las filas que se recuperan variará según el orden de las columnas especificadas después de la cláusula "agrupar por". Por ejemplo, considere la tabla Acon las siguientes filas:

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

SELECT *, SUM(Col3) FROM A GROUP BY Col2, Col1recuperará filas ordenadas por el Col2en orden ascendente.

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

Ahora cambie el orden de la columna en el grupo por a Col1, Col2. Las filas recuperadas se ordenan asc por Col1.

es decir 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: El monto total (es decir, la exactitud de la consulta) permanece exactamente igual.

AaCodes
fuente
7
Pero, a menos que se use un "ORDER BY", el orden de las filas de los resultados seleccionados no está definido de todos modos, ¿no es así? Por lo tanto, nunca debe confiar en ningún orden particular de filas, incluso si no usa GROUP BY en absoluto.
avl_sweden
De acuerdo con @avl_sweden, creo que la respuesta debería al menos indicar que este comportamiento es específico de la implementación. No hay garantía de que una versión más nueva (o incluso la misma) del servidor SQL no produzca un orden diferente.
NobodysNightmare
2

Si tengo dos columnas, una con cardinalidad muy alta y otra con cardinalidad muy baja (número único de valores), ¿importa en qué orden agrupe?

Consulta-1

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

Consulta-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 son iguales, el orden no funciona en grupo por cláusula.

Gauravk
fuente