SQL - subconsulta doplicados y valor mas alto

   
Vista:

subconsulta doplicados y valor mas alto

Publicado por juanma (6 intervenciones) el 07/10/2017 19:08:36
Hola tengo una tabla con nombre , dni y año de ingreso , la cuestión es que tengo muchos registros duplicados , con el siguiente código selecciono los repetidos y los ordeno por dni

1
2
3
4
5
6
7
8
9
10
SELECT *
FROM PLANILLA1617
WHERE DNI IN (
                                   SELECT DNI
	                                   FROM PLANILLA1617
	                                   GROUP BY DNI
	                                   HAVING COUNT(*) > 1
 
                                )
ORDER BY DNI;

Lo que no logro hacer es que en la misma consulta me seleccione de cada registro repetido el que tenga el año de ingreso mayor

ej :

nombre dni año
pedro 23232323 2016
pedro 23232323 2016
pedro 23232323 2017 --------- > que aparezca ese solo
juan 11111111 2015
juan 11111111 2016 ---------> que aparezca ese solo


estuve probando con algo así pero me da error

1
2
3
4
5
6
7
WHERE DNI IN (
               SELECT DNI, ANO_ING
               FROM PLANILLA1617
	           GROUP BY DNI
               WHERE DNI = ( HAVING COUNT(*) > 1) AND ANO_ING = ( SELECT MAX(ANO_ING) )
 
                                )

Saludos
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

subconsulta doplicados y valor mas alto

Publicado por leonardo_josue (1110 intervenciones) el 09/10/2017 16:08:08
Hola juanma:

En realidad estas complicando cosas en donde no debe haber complicación...

En primer lugar, no hay necesidad de utilizar la cláusula IN para filtrar los registros que quieres, pues a final de cuentas estás haciendo una subconsulta sobre la misma tabla... lo mismo pasa con la función MAX, no hay necesidad de ponerla en un WHERE cuando lo puedes hacer desde tu consulta principal:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
mysql> SELECT * FROM tabla;
+--------+-----------+------+
| nombre | dni       | año  |
+--------+-----------+------+
| pedro  |  23232323 | 2016 |
| pedro  |  23232323 | 2016 |
| pedro  |  23232323 | 2017 |
| juan   |  11111111 | 2015 |
| juan   |  11111111 | 2016 |
| leo    | 444444444 | 2017 |
+--------+-----------+------+
6 rows in set (0.00 sec)
 
mysql> SELECT nombre, dni, MAX(año) año
    -> FROM tabla
    -> GROUP BY nombre, dni
    -> HAVING COUNT(*) > 1;
+--------+----------+------+
| nombre | dni      | año  |
+--------+----------+------+
| juan   | 11111111 | 2016 |
| pedro  | 23232323 | 2017 |
+--------+----------+------+
2 rows in set (0.00 sec)

Te sugiero que te tomes un tiempo para leer algunos ejemplos de cómo utilizar las funciones de agrupación, ya que creo que no tienes mucha experiencia en ese campo.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

subconsulta doplicados y valor mas alto

Publicado por juanma (6 intervenciones) el 10/10/2017 01:44:53
Hola Leo , gracias mostrarme como se tiene que realizar el código , recién estoy empezando a explorar sql y tengo un montón de dudas

Mi otra consulta seria como puedo hacer para que dentro de los resultados de la consulta también me incluya los registros que no están repetidos , puedo usar DISTINCT ?


SELECT nombre, DISTINCT dni, MAX(año) año

FROM tabla

La idea es que me deje los registros únicos y de los repetidos deje el registro con el año mas actualizado

y una tercer consulta es si tengo otra tabla diferente pero con la misma estructura de datos y quiero realizar el mismo proceso de sacar duplicados tengo que usar UNION ? porque de esta forma podría mostrar los datos de las 2 tablas sin repetir , entonces el procedimiento seria realizar en las dos tablas el primer filtro y después la unión? pero de esta forma si en la tabla1 tengo ej: pedro - 11111- 2016 y en la tabla2 pedro-11111-2017 . en la unión se repetirían los registros con diferentes años.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

subconsulta doplicados y valor mas alto

Publicado por leonardo_josue (1110 intervenciones) el 10/10/2017 15:50:06
Hola de nuevo Juanma:

1
Mi otra consulta seria como puedo hacer para que dentro de los resultados de la consulta también me incluya los registros que no están repetidos , puedo usar DISTINCT ?

Estás confundiendo conceptos de agrupaciones y por lo tanto estás tratando de hacer cosas que no son necesarias... la cláusula DISTINCT lo que te regresa es un listado de registros DISTINTOS, es decir, elimina registros que estén duplicados:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
mysql> SELECT nombre, dni FROM tabla;
+--------+-----------+
| nombre | dni       |
+--------+-----------+
| pedro  |  23232323 |
| pedro  |  23232323 |
| pedro  |  23232323 |
| juan   |  11111111 |
| juan   |  11111111 |
| leo    | 444444444 |
+--------+-----------+
6 rows in set (0.00 sec)
 
mysql> SELECT DISTINCT nombre, dni FROM tabla;
+--------+-----------+
| nombre | dni       |
+--------+-----------+
| pedro  |  23232323 |
| juan   |  11111111 |
| leo    | 444444444 |
+--------+-----------+
3 rows in set (0.00 sec)

Veamos a ver si se entiende... si partimos de la consulta que te puse el día de ayer, pero hacemos un COUNT en el SELECT, tenemos esto:

1
2
3
4
5
6
7
8
9
10
11
mysql> SELECT nombre, dni, COUNT(*) total
    -> FROM tabla
    -> GROUP BY nombre, dni;
+--------+-----------+-------+
| nombre | dni       | total |
+--------+-----------+-------+
| juan   |  11111111 |     2 |
| leo    | 444444444 |     1 |
| pedro  |  23232323 |     3 |
+--------+-----------+-------+
3 rows in set (0.01 sec)

esto quiere decir que LEO, aparece sólo una vez en la tabla... ¿por qué razón no se muestra en la consulta de ayer? pues porque en la cláusula HAVING estamos filtrando a COUNT(*) > 1, entonces, ¿qué necesitas hacer? pues quitar ese filtro:

1
2
3
4
5
6
7
8
9
10
11
mysql> SELECT nombre, dni, max(año) año
    -> FROM tabla
    -> GROUP BY nombre, dni;
+--------+-----------+------+
| nombre | dni       | año  |
+--------+-----------+------+
| juan   |  11111111 | 2016 |
| leo    | 444444444 | 2017 |
| pedro  |  23232323 | 2017 |
+--------+-----------+------+
3 rows in set (0.00 sec)

Para la otra consulta, si tienes información en dos tablas, si, lo primero que deberías hacer es "JUNTAR" todos los registros en una sola tabla y después aplicar el MAX.. para asegurarte de que sólo aparezca una vez cada registro.

haz la prueba y nos comentas.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

subconsulta doplicados y valor mas alto

Publicado por juanma (6 intervenciones) el 19/10/2017 16:41:40
Hola , Gracias Leo , otra consulta , si aplico


1
2
3
4
5
6
7
8
9
10
11
='editor_code'>
SELECT *
FROM PLANILLA1617
WHERE DNI IN (
                                   SELECT DNI
	                                   FROM PLANILLA1617
	                                   GROUP BY DNI
 
 
                                )
ORDER BY DNI;

me devuelve :

nombre | dni | año | localidad
juan 1234567 2017 RIO GALLEGOS
juan 1234567 2016 CALETA OLIVIA
PEDRO 3333333 2015 RIO GALLEGOS
PEDRO 3333333 2016 RIO GALLEGOS

como puedo hacer para que me devuelva solo los valores duplicados del DNI pero si tiene diferentes localidades

ej: el resultado tendría que ser

nombre | dni | año | localidad
juan 1234567 2017 RIO GALLEGOS
juan 1234567 2016 CALETA OLIVIA


Saludos

Juan
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Revisar política de publicidad