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