Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

GROUP BY não remove duplicatas


GROUP BY não "remover duplicatas". GROUP BY permite agregação. Se tudo o que você deseja é combinar linhas duplicadas, use SELECT DISTINCT.

Se você precisar combinar linhas duplicadas em algumas colunas, use GROUP BY, mas você precisa especificar o que fazer com as outras colunas. Você pode omiti-los (não listando-os na cláusula SELECT) ou agregá-los (usando funções como SUM, MIN e AVG). Por exemplo:
SELECT watch.watch_id, COUNT(rec.street_number), MAX(watch.watch_date)
... GROUP by watch.watch_id

EDITAR

O OP pediu alguns esclarecimentos.

Considere a "view" -- todos os dados reunidos pelos FROMs, JOINs e WHEREs -- chame isso de V. Há duas coisas que você pode querer fazer.

Primeiro, você pode ter linhas completamente duplicadas que você deseja combinar:
a b c
- - -
1 2 3
1 2 3
3 4 5

Em seguida, basta usar DISTINCT
SELECT DISTINCT * FROM V;

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

Ou você pode ter linhas parcialmente duplicadas que você deseja combinar:
a b c
- - -
1 2 3
1 2 6
3 4 5

Essas duas primeiras linhas são "iguais" em certo sentido, mas claramente diferentes em outro sentido (em particular, elas não ser combinados por SELECT DISTINCT). Você tem que decidir como combiná-los. Você pode descartar a coluna c como sem importância:
SELECT DISTINCT a,b FROM V;

a b
- -
1 2
3 4

Ou você pode realizar algum tipo de agregação neles. Você poderia adicioná-los:
SELECT a,b, SUM(c) "tot" FROM V GROUP BY a,b;

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

Você pode adicionar escolher o menor valor:
SELECT a,b, MIN(c) "first" FROM V GROUP BY a,b;

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

Ou você pode pegar a média (AVG), o desvio padrão (STD) e qualquer um de um monte de outras funções que pegam vários valores para c e os combinam em um.

O que não é realmente uma opção é simplesmente não fazer nada. Se você apenas listar as colunas desagrupadas, o DBMS lançará um erro (o Oracle faz isso - a escolha certa, imo) ou escolherá um valor mais ou menos aleatoriamente (MySQL). Mas, como disse o Dr. Peart:"Quando você escolhe não decidir, ainda assim fez uma escolha."