SQL - Consulta muy complicada (para nota)

   
Vista:

Consulta muy complicada (para nota)

Publicado por amv (14 intervenciones) el 30/01/2008 19:39:17
Hola a todos y gracias a los que se atrevan con esto. Tengo un serio problema que no sé si es posible resolver con una consulta de SQL (T-SQL):

Tengo una tabla, por ejemplo PERSONAS, con los campos ID, NOMBRE, APELLIDOS y PUNTUACION, siendo el ID único para cada registro. Y ahí va la pregunta: ¿cómo podría obtener un conjunto de registros que tuviera un único registro por cada uno de los NOMBRES existentes en la tabla?

Me esplico con un ejemplo:

ID NOMBRE APELLIDOS PUNTUACION
1 NombreA ApellidosA 1
2 NombreA ApellidosB 11
3 NombreB ApellidosC 45
4 NombreA ApellidosD 754
5 NombreB ApellidosE 112
6 NombreC ApellidosF 98

Si se ordena por PUNTUACION el resultado deseado sería:

4 NombreA ApellidosD 754
5 NombreB ApellidosE 112
6 NombreC ApellidosF 98

Agradecería enormemente cualquier idea.
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

RE:Consulta muy complicada (para nota)

Publicado por orlando (5 intervenciones) el 30/01/2008 23:54:52
select * from personas order by desc puntuacion
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

RE:Consulta muy complicada (para nota)

Publicado por leo (16 intervenciones) el 31/01/2008 04:16:38
Un solo registro por nombre??
sin importar el apellido seria solo
select nombre from personas order by desc puntuacion
El que te escribieron antes no te da un solo registro por nombre.
Pero eso no es complicado.. cpz q te explicaste mal.
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

RE:Consulta muy complicada (para nota)

Publicado por amv (14 intervenciones) el 31/01/2008 08:26:34
Gracias por los intentos, pero creo que me expliqué mal, porque de ninguna de las dos formas se consigue el resultado que necesito.
Con select nombre from personas order by desc puntuacion obtengo todos los registros de la tabla ordenados por puntuación, pero no es eso lo que quiero. Lo que necesito es obtener un registro entero y único por cada nombre distinto.

El ejemplo de mi consulta inicial es exactamente lo que quiero. La primera parte es el contenido entero de la tabla y la segunda parte el resultado que quiero conseguir con una consulta. Si hay varios registros con NombreA, varios con NombreB y varios con NombreC, tengo que obtener un registro entero con NombreA, uno con NombreB y uno con NombreC y, en cualquier caso, el que tenga mayor puntuación.

Insisto: gracias por la ayuda. No es tan fácil.
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

RE:Consulta muy complicada (para nota)

Publicado por Maver (12 intervenciones) el 31/01/2008 13:09:46
Holas mira si los nombres son iguales y los apellidos tmb podrias probar los siguiente:

SELECT
NOMBRE,
APELLIDO,
SUM(PUNTUACION)
FROM TABLA

GROUP BY
NOMBRE,
APELLIDO

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

RE:Consulta muy complicada (para nota)

Publicado por amv (14 intervenciones) el 31/01/2008 15:00:22
Gracias. No, sólo los nombres son iguales y SUM me da la suma de todos los valores y necesito, de cada nombre, el registro entero con la puntuación más alta.

Creo que no se puede hacer. He probado con mil combinaciones de consultas y subconsultas y sigo sin conseguir nada.

Gracias de todos modos por los esfuerzos.
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

RE:Consulta muy complicada (para nota)

Publicado por amv (14 intervenciones) el 31/01/2008 13:05:17
Gracias, pero esa consulta no retorna el resultado esperado. Esa consulta retornaría todos los registros ordenados, pero TODOS al fin y al cabo. Necesito uno que retorne sólo un conjunto de registros (no todos, aunque sí todos sus datos) formado por un único registro por cada uno de los nombres distintos existentes en la tabla, excogiendo el que más puntuación tiene.

Si miras el ejemplo, es exactamente lo que busco: a partir de la tabla primera, una consulta que me devuelva los registros que se muestran en el ejemplo.

Gracias de todos modos por el intento.
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

RE:Consulta muy complicada (para nota)

Publicado por stella (16 intervenciones) el 31/01/2008 21:04:11
Prueba algo así:

select * from PERSONAS
where PUNTUACION in ( select max(PUNTUACION)
from PERSONAS
group by NOMBRE )
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

RE:Consulta muy complicada (para nota)

Publicado por amv (14 intervenciones) el 01/02/2008 08:23:30
EUREKA!!!

El caso real es algo más complejo, pero voy a tirar de la idea que me has dado porque quizá me dé resultado. En el caso real, PUNTUACION equivale a cuatro campos distintos que hay que evaluar, pero se podría hacer algún sistema de ponderación o algo así. El resto de campos (ID, Nombre, Apellidos)... bueno... cada uno equivale a una subsonsulta... En total tengo que jugar con 10 tablas usando JOIN, subconsultas y todo lo que se me ocurra.

Pero yo creo que me puede dar resultado tu idea, seguro que sí.

Gracias stella!!!!! Y gracias a todos los demás.

Un saludo.
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

RE:Consulta muy complicada (para nota)

Publicado por amv (14 intervenciones) el 01/02/2008 09:38:32
ooooooooooh...!!!!

Tiene un fallo!!! Es perfecto para puntuaciones distintas, pero si se diera el caso que un registro de NombreB tuviera una PUNTUACION igual a la máxima de los NombreA, también aparecería en los resultados, fuera cual fuera la máxima de los NombreB. En el momento en que existan puntuaciones iguales es probable que falle.

Casi...!!!!
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

RE:Consulta muy complicada (para nota)

Publicado por stella (16 intervenciones) el 01/02/2008 10:40:34
Añade where:

select *
from PERSONAS A
where PUNTUACION in ( select max(PUNTUACION) from PERSONAS
group by NOMBRE )

and exists ( select 1 from PERSONAS B
where NOMBRE = A.NOMBRE
and NMPUNTUACION = ( select max(PUNTUACION) from PERSONAS
where NOMBRE = B.NOMBRE
group by NOMBRE )

)
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

RE:Consulta muy complicada (para nota)

Publicado por amv (14 intervenciones) el 01/02/2008 12:58:57
Siguiendo con tu idea he llegado a la siguiente consulta...

select * from PERSONAS A
where PUNTUACION in
( select max(PUNTUACION) from PERSONAS group by NOMBRE )
and PUNTUACION =
(select max(PUNTUACION) from PERSONAS B where B.NOMBRE = A.NOMBRE )

Con la consulta de SELECT 1 FROM me seguía pasando lo mismo, por ejemplo: si tenía un NombreC con una PUNTUACION igual que la mayor de los NombreA, sin que esa fuera la mayor de los NombreC, en el resultado me aparecían dos NombreC, el que tiene la mayor PUNTUACION de los NombreA y el de la mayor PUNTUACION de los NombreC.

mmmmmm.... jajajaja... no sé si me entero yo mismo de la explicación que acabo de dar...

Bueno, el caso es que por eso he quitado esta parte y he añadido la igualación de PUNTUACION a la consulta principal. Pero con este cambio lo que ocurre es que si hay dos registros distintos con el mismo NOMBRE y la misma PUNTUACION que además sea máxima para ese NOMBRE, aparecen los dos. Y como me hacen falta todos los campos, no se puede poner un DISTINCT porque no serviría de nada.

Voy a seguir dando vueltas a tu idea a ver si llego a algo... Si encuentro algo lo diré...
Pero, ¿no será que no se puede hacer lo que quiero?
Qué rabia me dan estas cosas!!!!!

Mil gracias!!
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

RE:Consulta muy complicada (para nota)

Publicado por stella (16 intervenciones) el 01/02/2008 14:24:46
OK, algo así :

select * from PERSONAS A
where PUNTUACION in
( select max(PUNTUACION) from PERSONAS group by NOMBRE )

and PUNTUACION =
(select max(PUNTUACION) from PERSONAS where NOMBRE = A.NOMBRE )

and ID =
( select min(ID) from PERSONAS where NOMBRE = A.NOMBRE and PUNTUACION = A.PUNTUACION)
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

RE:Consulta muy complicada (para nota)

Publicado por amv (14 intervenciones) el 01/02/2008 14:43:32
Sí, con eso estaría... discriminando por ID o por APELLIDO o por lo que fuera.

Voy a ver cómo puedo aplicarlo a mi caso, pero la idea es esa.

Más que un amigo, un admirador...!!! Muchísimas gracias stella.
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

RE:Consulta muy complicada (para nota)

Publicado por Javierobick (2 intervenciones) el 07/02/2008 09:47:31
Bueno, creo que tengo algo

El primer paso es hacer una consulta (que luego será parte del from de otra) que nos de de cada persona igual la máxima puntuación, entonces

select nombre, max(puntuacion)
from personas
group by nombre

Esto nos dará el campo nombre y puntuación maxima. Para obtener el id y apellidos tenemos que "encapsular" esta consulta.

select *
from personas p1
inner join
(
select nombre, max(puntuacion) as puntuacion
from personas
group by nombre
) p2
on p1.nombre = p2.nombre
and p1.puntuacion = p2.puntuacion

Ya tendríamos todos los campos. La única pega es por un comentario que hiciste, ¿es posible que exista un mismo nombre con la misma puntuación y que además sea máxima?. Si es así, tendrías algún repetido.

Un saludo y ya me contarás.
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