GROUP BY nie „usuwa duplikatów”. GROUP BY umożliwia agregację. Jeśli chcesz tylko połączyć zduplikowane wiersze, użyj opcji SELECT DISTINCT.
Jeśli chcesz połączyć wiersze, które są zduplikowane w niektórych kolumnach, użyj opcji GRUPUJ WEDŁUG, ale musisz określić, co zrobić z innymi kolumnami. Możesz je pominąć (nie wymieniając ich w klauzuli SELECT) lub zagregować (za pomocą funkcji takich jak SUM, MIN i AVG). Na przykład:
SELECT watch.watch_id, COUNT(rec.street_number), MAX(watch.watch_date)
... GROUP by watch.watch_id
EDYTUJ
PO poprosił o pewne wyjaśnienia.
Rozważ „widok” – wszystkie dane zebrane razem przez FROM, JOIN i GDZIE – nazwij to V. Są dwie rzeczy, które możesz chcieć zrobić.
Po pierwsze, możesz mieć całkowicie zduplikowane wiersze które chcesz połączyć:
a b c
- - -
1 2 3
1 2 3
3 4 5
Następnie po prostu użyj DISTINCT
SELECT DISTINCT * FROM V;
a b c
- - -
1 2 3
3 4 5
Możesz też mieć częściowo zduplikowane wiersze które chcesz połączyć:
a b c
- - -
1 2 3
1 2 6
3 4 5
Te dwa pierwsze wiersze są w pewnym sensie „takie same”, ale wyraźnie różnią się w innym sensie (w szczególności nie być połączone przez SELECT DISTINCT). Musisz zdecydować, jak je połączyć. Możesz odrzucić kolumnę c jako nieważną:
SELECT DISTINCT a,b FROM V;
a b
- -
1 2
3 4
Możesz też wykonać na nich jakąś agregację. Możesz je dodać:
SELECT a,b, SUM(c) "tot" FROM V GROUP BY a,b;
a b tot
- - ---
1 2 9
3 4 5
Możesz dodać wybierz najmniejszą wartość:
SELECT a,b, MIN(c) "first" FROM V GROUP BY a,b;
a b first
- - -----
1 2 3
3 4 5
Możesz też wziąć średnią (AVG), odchylenie standardowe (STD) i dowolną z wielu innych funkcji, które pobierają kilka wartości dla c i połączyć je w jedną.
To, co tak naprawdę nie wchodzi w grę, to po prostu nic nie robić. Jeśli po prostu wypiszesz niezgrupowane kolumny, DBMS albo zgłosi błąd (Oracle robi to - właściwy wybór, imo) albo wybierze jedną wartość mniej lub bardziej losowo (MySQL). Ale jak powiedział dr Peart:„Kiedy zdecydujesz się nie decydować, nadal dokonałeś wyboru”.