Mysql
 sql >> Baza danych >  >> RDS >> Mysql

GROUP BY nie usuwa duplikatów

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”.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy mogę używać VARCHAR jako KLUCZA PODSTAWOWEGO?

  2. Błąd podczas wstawiania wartości typu danych blob do tabeli mysql

  3. MySQL - Jak wstawić do tabeli, która ma relację wiele do wielu

  4. Czy można wyłączyć usuwanie w tabeli na MYSQL?

  5. Jak zaokrąglić znacznik czasu w MySQL