O que significa a cláusula SQL "GROUP BY 1"?

203

Alguém me enviou uma consulta SQL em que a GROUP BYcláusula consistia na declaração:GROUP BY 1 .

Isso deve ser um erro de digitação, certo? Nenhuma coluna recebe o alias 1. O que isso pode significar? Estou certo em assumir que isso deve ser um erro de digitação?

Spencer
fonte
6
A sua não é um erro de digitação, sua primeira coluna do conjunto de resultados
Lamak
9
Observe que essa sintaxe não é portátil. Ele se comportará de maneira diferente em bancos de dados diferentes do mysql. No Oracle, por exemplo, é tratado como uma constante.
Russell Reed
2
@RussellReed Sim. infelizmente (já que o uso de um alias às vezes é muito útil), o ansi sql não permite agrupar por coluna ordinal. A razão é que o grupo acontece antes da projeção. Mas então .. o que acontece quando temos expressões de agrupamento com dezenas de linhas .. acabamos com .. mutículos de dezenas de linhas na instrução sql final.
Javadba

Respostas:

232

Significa agrupar pela primeira coluna, independentemente do nome. Você pode fazer o mesmo com ORDER BY.

que nojo
fonte
74
SELECT account_id, open_emp_id
         ^^^^        ^^^^
          1           2

FROM account
GROUP BY 1;

Na consulta acima, GROUP BY 1refere-se ao first column in select statementque é account_id.

Você também pode especificar ORDER BY.

Nota: O número em ORDER BY e GROUP BY sempre começa com 1 e não com 0.

Vishwanath Dalvi
fonte
25

Além de agrupar pelo nome do campo, você também pode agrupar por ordinal ou posição do campo na tabela. 1 corresponde ao primeiro campo (independentemente do nome), 2 é o segundo e assim por diante.

Isso geralmente é desaconselhável se você estiver agrupando algo específico, pois a estrutura da tabela / exibição pode mudar. Além disso, pode ser difícil compreender rapidamente o que sua consulta SQL está fazendo se você não memorizou os campos da tabela.

Se você estiver retornando um conjunto exclusivo ou executando rapidamente uma pesquisa temporária, essa é uma sintaxe abreviada para reduzir a digitação. Se você planeja executar a consulta novamente em algum momento, recomendo substituí-las para evitar futuras confusões e complicações inesperadas (devido a alterações no esquema).

vol7ron
fonte
10
+1 para "não faça isso" e eu acrescentaria que o melhor motivo para evitá-lo é que não é legível.
Yuck
11

Agrupará por primeiro campo na cláusula de seleção

Daan Geurts
fonte
5

Isso significa que sql agrupa pela 1ª coluna na sua cláusula select, sempre a usamos GROUP BY 1juntamente com ORDER BY 1, além de que você também pode usar assim GROUP BY 1,2,3.., é claro que é conveniente para nós, mas você precisa prestar atenção a essa condição, pois o resultado pode não ser o que você deseja. deseja que alguém modifique suas colunas de seleção e não seja visualizado

张艳军
fonte
4

Agrupará pela posição da coluna que você coloca após a cláusula agrupar.

por exemplo, se você executar " SELECT SALESMAN_NAME, SUM(SALES) FROM SALES GROUP BY 1", ele será agrupado por SALESMAN_NAME.

Um risco é que, se você executar ' Select *' e, por algum motivo, recriar a tabela com colunas em uma ordem diferente, ele fornecerá um resultado diferente do que você esperaria.

wdoering
fonte