Mysql
 sql >> Database >  >> RDS >> Mysql

GROUP BY non rimuove i duplicati

GROUP BY non "rimuove i duplicati". GROUP BY consente l'aggregazione. Se tutto ciò che vuoi è combinare righe duplicate, usa SELECT DISTINCT.

Se è necessario combinare righe duplicate in alcune colonne, utilizzare GROUP BY ma è necessario specificare cosa fare con le altre colonne. Puoi ometterli (non elencandoli nella clausola SELECT) o aggregarli (utilizzando funzioni come SUM, MIN e AVG). Ad esempio:

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

MODIFICA

L'OP ha chiesto dei chiarimenti.

Considera la "vista" -- tutti i dati messi insieme da FROM, JOIN e WHERE -- chiamala V. Ci sono due cose che potresti voler fare.

Innanzitutto, potresti avere righe completamente duplicate che desideri combinare:

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

Quindi usa semplicemente DISTINCT

SELECT DISTINCT * FROM V;

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

Oppure potresti avere righe parzialmente duplicate che desideri combinare:

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

Quelle prime due righe sono "uguali" in un certo senso, ma chiaramente diverse in un altro senso (in particolare, non essere combinato da SELECT DISTINCT). Devi decidere come combinarli. Puoi scartare la colonna c come irrilevante:

SELECT DISTINCT a,b FROM V;

a b
- -
1 2
3 4

Oppure potresti eseguire una sorta di aggregazione su di essi. Potresti sommarli:

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

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

Puoi aggiungere scegli il valore più piccolo:

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

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

Oppure potresti prendere la media (AVG), la deviazione standard (STD) e una qualsiasi delle altre funzioni che prendono una serie di valori per c e li combinano in uno solo.

Ciò che non è davvero un'opzione è semplicemente non fare nulla. Se elenchi solo le colonne non raggruppate, il DBMS genererà un errore (Oracle lo fa - la scelta giusta, imo) o sceglierà un valore più o meno a caso (MySQL). Ma come ha detto il dottor Peart, "Quando scegli di non decidere, hai comunque fatto una scelta".