sql >> Base de Datos >  >> RDS >> Mysql

GROUP BY no elimina duplicados

GROUP BY no "elimina duplicados". GROUP BY permite la agregación. Si todo lo que desea es combinar filas duplicadas, use SELECCIONAR DISTINTO.

Si necesita combinar filas que están duplicadas en algunas columnas, use GROUP BY pero debe especificar qué hacer con las otras columnas. Puede omitirlos (al no incluirlos en la cláusula SELECT) o agregarlos (usando funciones como SUM, MIN y AVG). Por ejemplo:

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

EDITAR

El OP pidió alguna aclaración.

Considere la "vista":todos los datos reunidos por FROM, JOIN y WHERE, llámelo V. Hay dos cosas que quizás desee hacer.

Primero, es posible que tenga filas completamente duplicadas que desea combinar:

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

Entonces simplemente use DISTINCT

SELECT DISTINCT * FROM V;

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

O bien, es posible que tenga filas parcialmente duplicadas que desea combinar:

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

Esas dos primeras filas son "iguales" en cierto sentido, pero claramente diferentes en otro sentido (en particular, no combinarse con SELECT DISTINCT). Tienes que decidir cómo combinarlos. Podría descartar la columna c como sin importancia:

SELECT DISTINCT a,b FROM V;

a b
- -
1 2
3 4

O podría realizar algún tipo de agregación en ellos. Podrías agregarlos:

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

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

Puede agregar elegir el valor más pequeño:

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

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

O podría tomar la media (AVG), la desviación estándar (STD) y cualquiera de un montón de otras funciones que toman un montón de valores para c y los combinan en uno.

Lo que no es realmente una opción es simplemente no hacer nada. Si solo enumera las columnas no agrupadas, el DBMS arrojará un error (Oracle hace eso, la elección correcta, en mi opinión) o elegirá un valor más o menos al azar (MySQL). Pero como dijo el Dr. Peart, "cuando eliges no decidir, todavía has tomado una decisión".