¿Qué significa la cláusula SQL "GROUP BY 1"?

203

Alguien me envió una consulta SQL en la GROUP BYcláusula consistió en la declaración: GROUP BY 1.

Esto debe ser un error tipográfico ¿verdad? Ninguna columna recibe el alias 1. ¿Qué podría significar esto? ¿Tengo razón al suponer que esto debe ser un error tipográfico?

Spencer
fuente
66
No es un error tipográfico, es la primera columna de su conjunto de resultados
Lamak
9
Tenga en cuenta que esta sintaxis no es portátil. Se comportará de manera diferente en bases de datos que no sean mysql. En Oracle, por ejemplo, se trata como una constante.
Russell Reed
2
@RussellReed Sí. desafortunadamente (dado que usar un alias a veces es muy útil) ansi sql no permite la agrupación por columna ordinal. La razón es que el grupo pasa antes de la proyección. Pero entonces ... ¿qué pasa cuando tenemos expresiones de agrupación con decenas de líneas ... terminamos con ... mutiples de decenas de líneas en la sentencia sql final?
Java

Respuestas:

233

Significa agrupar por la primera columna, independientemente de cómo se llame. Puedes hacer lo mismo con ORDER BY.

Yuck
fuente
74
SELECT account_id, open_emp_id
         ^^^^        ^^^^
          1           2

FROM account
GROUP BY 1;

En la consulta anterior se GROUP BY 1refiere a first column in select statementcuál es account_id.

También puede especificar en ORDER BY.

Nota: El número en ORDER BY y GROUP BY siempre comienza con 1, no con 0.

Vishwanath Dalvi
fuente
25

Además de agrupar por el nombre del campo, también puede agrupar por ordinal o posición del campo dentro de la tabla. 1 corresponde al primer campo (independientemente del nombre), 2 es el segundo, y así sucesivamente.

Esto generalmente no es aconsejable si está agrupando en algo específico, ya que la estructura de la tabla / vista puede cambiar. Además, puede ser difícil comprender rápidamente lo que está haciendo su consulta SQL si no ha memorizado los campos de la tabla.

Si devuelve un conjunto único o realiza rápidamente una búsqueda temporal, esta es una buena sintaxis abreviada para reducir la escritura. Si planea ejecutar la consulta nuevamente en algún momento, le recomiendo reemplazarlos para evitar futuras confusiones y complicaciones inesperadas (debido a cambios en el esquema).

vol7ron
fuente
10
+1 para "no hagas esto" y agregaría que la mejor razón para evitarlo es que no es legible.
Yuck
11

Se agrupará por primer campo en la cláusula select

Daan Geurts
fuente
5

Eso significa agrupar sql por primera columna en su cláusula select, siempre usamos esto GROUP BY 1junto con ORDER BY 1, además de que también puede usarlo así GROUP BY 1,2,3.., por supuesto, es conveniente para nosotros, pero debe prestar atención a esa condición, el resultado puede no ser lo que usted desea. si alguien ha modificado sus columnas de selección y no se visualiza

张艳军
fuente
4

Se agrupará por la posición de la columna que coloca después de la cláusula group by.

por ejemplo, si ejecuta ' SELECT SALESMAN_NAME, SUM(SALES) FROM SALES GROUP BY 1' se agrupará por SALESMAN_NAME.

Un riesgo al hacerlo es si ejecuta ' Select *' y, por alguna razón, vuelve a crear la tabla con columnas en un orden diferente, le dará un resultado diferente al esperado.

wdoering
fuente