Mysql
 sql >> Base de données >  >> RDS >> Mysql

GROUP BY ne supprime pas les doublons

GROUP BY ne "supprime pas les doublons". GROUP BY permet l'agrégation. Si tout ce que vous voulez est de combiner des lignes dupliquées, utilisez SELECT DISTINCT.

Si vous devez combiner des lignes qui sont en double dans certaines colonnes, utilisez GROUP BY mais vous devez spécifier quoi faire avec les autres colonnes. Vous pouvez soit les omettre (en ne les listant pas dans la clause SELECT), soit les agréger (en utilisant des fonctions telles que SUM, MIN et AVG). Par exemple :

SELECT watch.watch_id, COUNT(rec.street_number), MAX(watch.watch_date)
... GROUP by watch.watch_id

MODIFIER

Le PO a demandé des éclaircissements.

Considérez la "vue" - toutes les données rassemblées par les FROM, les JOIN et les WHERE - appelez cela V. Il y a deux choses que vous pourriez vouloir faire.

Tout d'abord, vous pourriez avoir des lignes complètement dupliquées que vous souhaitez combiner :

a b c
- - -
1 2 3
1 2 3
3 4 5

Ensuite, utilisez simplement DISTINCT

SELECT DISTINCT * FROM V;

a b c
- - -
1 2 3
3 4 5

Ou, vous pourriez avoir des lignes partiellement dupliquées que vous souhaitez combiner :

a b c
- - -
1 2 3
1 2 6
3 4 5

Ces deux premières lignes sont "les mêmes" dans un certain sens, mais clairement différentes dans un autre sens (en particulier, elles ne seraient pas être combinés par SELECT DISTINCT). Vous devez décider comment les combiner. Vous pouvez supprimer la colonne c comme étant sans importance :

SELECT DISTINCT a,b FROM V;

a b
- -
1 2
3 4

Ou vous pouvez effectuer une sorte d'agrégation sur eux. Vous pouvez les additionner :

SELECT a,b, SUM(c) "tot" FROM V GROUP BY a,b;

a b tot
- - ---
1 2 9
3 4 5

Vous pouvez ajouter sélectionner la plus petite valeur :

SELECT a,b, MIN(c) "first" FROM V GROUP BY a,b;

a b first
- - -----
1 2 3
3 4 5

Ou vous pouvez prendre la moyenne (AVG), l'écart type (STD) et n'importe laquelle d'un tas d'autres fonctions qui prennent un tas de valeurs pour c et les combinent en une seule.

Ce qui n'est pas vraiment une option, c'est de ne rien faire. Si vous répertoriez simplement les colonnes non groupées, le SGBD générera une erreur (Oracle le fait - le bon choix, imo) ou choisira une valeur plus ou moins au hasard (MySQL). Mais comme l'a dit le Dr Peart :"Lorsque vous choisissez de ne pas décider, vous avez quand même fait un choix."