Mysql
 sql >> Datenbank >  >> RDS >> Mysql

GROUP BY entfernt keine Duplikate

GROUP BY "entfernt keine Duplikate". GROUP BY ermöglicht die Aggregation. Wenn Sie nur duplizierte Zeilen kombinieren möchten, verwenden Sie SELECT DISTINCT.

Wenn Sie Zeilen kombinieren müssen, die in einigen Spalten doppelt vorhanden sind, verwenden Sie GROUP BY, aber Sie müssen angeben, was mit den anderen Spalten geschehen soll. Sie können sie entweder weglassen (indem Sie sie nicht in der SELECT-Klausel auflisten) oder sie aggregieren (mit Funktionen wie SUM, MIN und AVG). Zum Beispiel:

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

BEARBEITEN

Das OP bat um eine Klarstellung.

Betrachten Sie die „Ansicht“ – alle Daten, die von den FROMs und JOINs und den WHEREs zusammengestellt werden – nennen Sie das V. Es gibt zwei Dinge, die Sie vielleicht tun möchten.

Erstens könnten Sie vollständig doppelte Zeilen haben die Sie kombinieren möchten:

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

Dann verwenden Sie einfach DISTINCT

SELECT DISTINCT * FROM V;

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

Oder Sie haben möglicherweise teilweise doppelte Zeilen die Sie kombinieren möchten:

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

Diese ersten beiden Zeilen sind in gewissem Sinne "gleich", unterscheiden sich aber in einem anderen Sinne deutlich (insbesondere nicht durch SELECT DISTINCT kombiniert werden). Sie müssen entscheiden, wie Sie sie kombinieren. Sie könnten Spalte c als unwichtig verwerfen:

SELECT DISTINCT a,b FROM V;

a b
- -
1 2
3 4

Oder Sie könnten eine Art Aggregation für sie durchführen. Sie könnten sie addieren:

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

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

Sie könnten den kleinsten Wert auswählen:

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

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

Oder Sie könnten den Mittelwert (AVG), die Standardabweichung (STD) und eine Reihe anderer Funktionen nehmen, die eine Reihe von Werten für c nehmen und sie zu einem kombinieren.

Was nicht wirklich eine Option ist, ist einfach nichts zu tun. Wenn Sie nur die nicht gruppierten Spalten auflisten, gibt das DBMS entweder einen Fehler aus (Oracle macht das - die richtige Wahl, imo) oder wählt einen Wert mehr oder weniger zufällig aus (MySQL). Aber wie Dr. Peart sagte:"Wenn Sie sich entscheiden, sich nicht zu entscheiden, haben Sie immer noch eine Wahl getroffen."