sql >> Database >  >> RDS >> Mysql

GROUP BY verwijdert geen duplicaten

GROUP BY "verwijdert geen dubbele". GROUP BY maakt aggregatie mogelijk. Als je alleen dubbele rijen wilt combineren, gebruik dan SELECT DISTINCT.

Als u rijen moet combineren die in sommige kolommen dubbel zijn, gebruik dan GROUP BY, maar u moet specificeren wat u met de andere kolommen moet doen. U kunt ze weglaten (door ze niet op te nemen in de SELECT-clausule) of ze samenvoegen (met functies zoals SUM, MIN en AVG). Bijvoorbeeld:

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

BEWERKEN

De OP vroeg om enige opheldering.

Denk aan de "view" -- alle gegevens die zijn samengesteld door de FROM's en JOIN's en de WHERE's -- noem die V. Er zijn twee dingen die u zou kunnen doen.

Ten eerste heeft u mogelijk volledig dubbele rijen die u wilt combineren:

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

Gebruik dan gewoon DISTINCT

SELECT DISTINCT * FROM V;

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

Of misschien heeft u gedeeltelijk dubbele rijen die u wilt combineren:

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

Die eerste twee rijen zijn in zekere zin "hetzelfde", maar duidelijk verschillend in een andere betekenis (in het bijzonder zouden ze niet worden gecombineerd door SELECT DISTINCT). Je moet beslissen hoe je ze combineert. U kunt kolom c weggooien als onbelangrijk:

SELECT DISTINCT a,b FROM V;

a b
- -
1 2
3 4

Of je kunt er een soort aggregatie op uitvoeren. Je zou ze kunnen optellen:

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

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

U kunt de kleinste waarde toevoegen:

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

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

Of u kunt het gemiddelde (AVG), de standaarddeviatie (STD) en een aantal andere functies nemen die een aantal waarden voor c nemen en deze combineren tot één.

Wat niet echt een optie is, is gewoon niets doen. Als je alleen de niet-gegroepeerde kolommen opsomt, zal het DBMS ofwel een fout geven (Oracle doet dat - de juiste keuze, imo) of een waarde min of meer willekeurig kiezen (MySQL). Maar zoals Dr. Peart zei:"Als je ervoor kiest om niet te beslissen, heb je nog steeds een keuze gemaakt."



  1. Tel het aantal waarden per id

  2. mysql-query om alles te selecteren behalve

  3. SQL/Laravel - Waarom retourneert mijn query een lege verzameling?

  4. mySQL-tabellen met Wildcard laten vallen met alleen SQL-instructie?