Que signifie la clause SQL «GROUP BY 1»?

203

Quelqu'un m'a envoyé une requête SQL où la GROUP BYclause consistait de la déclaration: GROUP BY 1.

Ce doit être une faute de frappe, non? Aucune colonne ne reçoit l'alias 1. Qu'est-ce que cela pourrait signifier? Ai-je raison de supposer que ce doit être une faute de frappe?

Spencer
la source
6
Ce n'est pas une faute de frappe, c'est la première colonne de votre jeu de résultats
Lamak
9
Notez que cette syntaxe n'est pas portable. Il se comportera différemment sur des bases de données autres que mysql. Dans Oracle, par exemple, il est traité comme une constante.
Russell Reed
2
@RussellReed Oui. malheureusement (puisque l'utilisation d'un alias est parfois très utile) ansi sql ne permet pas le regroupement par ordinal de colonne. La raison en est que le groupe se produit avant la projection. Mais alors .. que faire lorsque nous avons des expressions de regroupement avec des dizaines de lignes .. nous nous retrouvons avec .. des multiples de dizaines de lignes dans l'instruction sql finale.
javadba

Réponses:

233

Cela signifie de regrouper par la première colonne quel que soit son nom. Vous pouvez faire de même avec ORDER BY.

Beurk
la source
74
SELECT account_id, open_emp_id
         ^^^^        ^^^^
          1           2

FROM account
GROUP BY 1;

Dans la requête ci-dessus se GROUP BY 1réfère à first column in select statementqui est account_id.

Vous pouvez également spécifier dans ORDER BY.

Remarque: Le nombre dans ORDER BY et GROUP BY commence toujours par 1 et non par 0.

Vishwanath Dalvi
la source
25

En plus du regroupement par nom de champ, vous pouvez également regrouper par ordinal ou position du champ dans la table. 1 correspond au premier champ (quel que soit le nom), 2 est le second, et ainsi de suite.

Ceci est généralement déconseillé si vous vous regroupez sur quelque chose de spécifique, car la structure de la table / vue peut changer. De plus, il peut être difficile de comprendre rapidement ce que fait votre requête SQL si vous n'avez pas mémorisé les champs de la table.

Si vous renvoyez un ensemble unique ou effectuez rapidement une recherche temporaire, il s'agit d'une syntaxe abrégée intéressante pour réduire la saisie. Si vous prévoyez d'exécuter à nouveau la requête à un moment donné, je vous recommande de les remplacer pour éviter toute confusion future et complications inattendues (en raison de changements de schéma).

vol7ron
la source
10
+1 pour "ne faites pas cela" et j'ajouterais que la meilleure raison de l'éviter est qu'il n'est pas lisible.
Beurk
11

Il regroupera par premier champ dans la clause select

Daan Geurts
la source
5

Cela signifie que le groupe sql par 1ère colonne dans votre clause de sélection, nous utilisons toujours cela GROUP BY 1avec ORDER BY 1, en plus vous pouvez également utiliser comme ça GROUP BY 1,2,3.., bien sûr, cela nous convient, mais vous devez faire attention à cette condition, le résultat peut ne pas être ce que vous voulez si quelqu'un a modifié vos colonnes de sélection, et il n'est pas visualisé

张艳军
la source
4

Il regroupera par la position de colonne que vous mettez après la clause group by.

par exemple, si vous exécutez ' SELECT SALESMAN_NAME, SUM(SALES) FROM SALES GROUP BY 1', il sera regroupé parSALESMAN_NAME .

Si vous exécutez ` Select *` et pour une raison quelconque, vous recréez la table avec des colonnes dans un ordre différent, cela vous donnera un résultat différent de celui auquel vous vous attendez.

wdoering
la source