sql >> Databasteknik >  >> RDS >> Mysql

GROUP BY tar inte bort dubbletter

GROUP BY "tar inte bort dubbletter". GROUP BY tillåter aggregering. Om allt du vill är att kombinera dubblerade rader, använd SELECT DISTINCT.

Om du behöver kombinera rader som är dubbletter i vissa kolumner, använd GROUP BY men du måste ange vad du ska göra med de andra kolumnerna. Du kan antingen utelämna dem (genom att inte lista dem i SELECT-satsen) eller aggregera dem (med funktioner som SUM, MIN och AVG). Till exempel:

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

REDIGERA

OP bad om ett förtydligande.

Tänk på "vyn" -- all data sammanställd av FROM och JOIN och WHERE -- kallar det V. Det finns två saker du kanske vill göra.

För det första kan du ha helt dubblerade rader som du vill kombinera:

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

Använd sedan helt enkelt DISTINCT

SELECT DISTINCT * FROM V;

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

Eller så kanske du har delvis dubbletter av rader som du vill kombinera:

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

De två första raderna är "samma" i någon mening, men klart olika i en annan mening (i synnerhet skulle de inte kombineras med SELECT DISTINCT). Du måste bestämma hur du ska kombinera dem. Du kan slänga kolumn c som oviktig:

SELECT DISTINCT a,b FROM V;

a b
- -
1 2
3 4

Eller så kan du utföra någon form av aggregering på dem. Du kan lägga till dem:

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

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

Du kan lägga till det minsta värdet:

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

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

Eller så kan du ta medelvärdet (AVG), standardavvikelsen (STD) och vilken som helst av en massa andra funktioner som tar ett gäng värden för c och kombinera dem till ett.

Det som egentligen inte är ett alternativ är att bara göra ingenting. Om du bara listar de ogrupperade kolumnerna kommer DBMS antingen att ge ett fel (Oracle gör det -- rätt val, imo) eller välja ett värde mer eller mindre slumpmässigt (MySQL). Men som Dr Peart sa:"När du väljer att inte bestämma dig, har du fortfarande gjort ett val."



  1. SQL Server 2016:Säkerhetskopiera en databas

  2. Implementera super-typ subtyp korrekt i MySQL

  3. SQL Hämta hela raden baserat på minimivärdet för den beräknade kolumnen

  4. UTF-8 fungerar inte i HTML-formulär