2010-06-17 21 views
54

Si tengo dos columnas, una con cardinalidad muy alta y una con cardinalidad muy baja (número de valores único), ¿qué importancia tiene el orden en el que agrupo?¿Importa el orden de las columnas en una cláusula group by?

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 donde importa?

+1

Ver publicación relacionada también: [orden de grupo MYSQL5 por ...] (http://stackoverflow.com/questions/1095645/mysql-5-does-it-matter-what-order-my-group- by-fields-are-in) – trcarden

Respuesta

49

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 son omitidas del grupo por (no estándar, no portátil) pero el orden no importa allí tampoco.

20

SQL es declarativo.

En este caso, le dijo al optimizador cómo quiere agrupar los datos y cómo funciona.

No evaluará línea por línea (procedimiento) y buscar en una primera columna de

Los principales asuntos orden de las columnas lugar es para los índices. col1, col2 no es lo mismo que col2, col1. En absoluto.

+5

También es importante para ORDER BY. –

10

Hay 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 se deben agrupar en el resultado. ROLLUP está en desuso sin embargo. La alternativa estándar de SQL es usar conjuntos de agrupación, que es compatible con SQL Server 2008 y versiones posteriores.

4

Como 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 corrección de la consulta (es decir, el importe de la suma).

Sin embargo, el orden de las filas que se recuperarán variará en función del orden de las columnas especificadas después de la cláusula "agrupar por". Por ejemplo, consideremos la tabla A con 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, Col1 será recuperar filas ordenadas por la Col2 en orden ascendente.

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

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

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: La suma de la cantidad (es decir, la corrección de la consulta) sigue siendo exactamente el mismo.

+0

ahora eso es lo que estaba buscando ... gracias –

0

Si tengo dos columnas, una con cardinalidad muy alta y una con muy poca cardinalidad (número de valores único), ¿qué importancia tiene el orden en el que agrupo?

de consulta-1

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

de 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.

Cuestiones relacionadas