sql >> Databáze >  >> RDS >> Mysql

GROUP BY neodstraňuje duplikáty

GROUP BY „neodstraňuje duplikáty“. GROUP BY umožňuje agregaci. Pokud vše, co chcete, je spojit duplicitní řádky, použijte SELECT DISTINCT.

Pokud potřebujete sloučit řádky, které jsou v některých sloupcích duplicitní, použijte GROUP BY, ale musíte určit, co dělat s ostatními sloupci. Můžete je buď vynechat (tak, že je neuvedete v klauzuli SELECT), nebo je agregovat (pomocí funkcí jako SUM, MIN a AVG). Například:

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

UPRAVIT

OP požádal o určité vysvětlení.

Zvažte "view" - všechna data sestavená pomocí FROM a JOINů a WHERE - tomu se říká V. Jsou dvě věci, které byste mohli chtít udělat.

Za prvé, můžete mít zcela duplicitní řádky které chcete zkombinovat:

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

Pak jednoduše použijte DISTINCT

SELECT DISTINCT * FROM V;

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

Nebo můžete mít částečně duplicitní řádky které chcete zkombinovat:

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

Tyto první dva řádky jsou v určitém smyslu „stejné“, ale v jiném smyslu jasně odlišné (zejména by nebyly kombinovat pomocí SELECT DISTINCT). Musíte se rozhodnout, jak je kombinovat. Sloupec c můžete zahodit jako nedůležitý:

SELECT DISTINCT a,b FROM V;

a b
- -
1 2
3 4

Nebo na nich můžete provést nějakou agregaci. Můžete je sečíst:

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

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

Můžete přidat a vybrat nejmenší hodnotu:

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

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

Nebo můžete vzít průměr (AVG), směrodatnou odchylku (STD) a kteroukoli z mnoha dalších funkcí, které berou spoustu hodnot pro c a sloučit je do jedné.

Co ve skutečnosti není možnost, je prostě nedělat nic. Pokud pouze vypíšete neseskupené sloupce, DBMS buď vyvolá chybu (Oracle to udělá - správná volba, imo), nebo vybere jednu hodnotu víceméně náhodně (MySQL). Ale jak řekl Dr. Peart:"Když se rozhodnete nerozhodnout, stále jste si vybrali."



  1. Jak zakázat možnosti dynamického výběrového pole na základě dat pocházejících ze dvou tabulek v databázi mysql

  2. dbms_scheduler Vytvořit úlohu Úloha není spuštěna

  3. Tabulkové prostory v Oracle

  4. Laravel vypočítá součet dvou sloupců s podmínkou