Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

[SOLUCIONADO] buscar el resultado que mas se ajuste de cada id

Estas en el tema de buscar el resultado que mas se ajuste de cada id en el foro de SQL Server en Foros del Web. Buenos días a todos, soy nuevo en este foro, llevo varios días dándole vueltas a la cabeza de como hacer para que conseguir el resultado ...
  #1 (permalink)  
Antiguo 19/07/2011, 15:44
 
Fecha de Ingreso: julio-2011
Ubicación: Palma
Mensajes: 25
Antigüedad: 12 años, 9 meses
Puntos: 1
Pregunta buscar el resultado que mas se ajuste de cada id

Buenos días a todos,

soy nuevo en este foro, llevo varios días dándole vueltas a la cabeza de como hacer para que conseguir el resultado de un buscador de ciudades, pero no consigo dar con la solución,
tengo varias ciudades con el precio según determinados días y necesitaría conseguir un listado con cada una de las ciudades con el valor que más se ajuste a los días buscados, esto es,

tengo la siguiente tabla:

+----+-----------------+-----+--------+
| id | nombre | dias| precio |
+----+-----------------+-----+--------+
| 01 | madrid | 3 | 20 |
| 01 | madrid | 5 | 25 |
| 01 | madrid | 7 | 30 |
| 01 | madrid | 10 | 35 |
| 02 | barcelona | 3 | 15 |
| 02 | barcelona | 7 | 19 |
| 02 | barcelona | 12 | 25 |
| 03 | bilbao | 1 | 7 |
| 03 | bilbao | 4 | 9 |
| 03 | bilbao | 9 | 10 |
| 04 | sevilla | 4 | 10 |
| 04 | sevilla | 11 | 20 |
+----+------------------+-----+--------+


y tengo un buscador de días, luego me devolverá cada una de las ciudades con el día más próximo al buscado y su correspondiente precio.

Luego si hago la busqueda para 5 días, el resultado debería ser éste:

+----+-----------------+-----+--------+
| id | nombre | dias| precio |
+----+-----------------+-----+--------+
| 01 | madrid | 5 | 25 |
| 02 | barcelona | 7 | 19 |
| 03 | bilbao | 9 | 10 |
| 04 | sevilla | 11 | 20 |
+----+------------------+-----+--------+

Alguna sugerencia? Mil gracias de antemano
  #2 (permalink)  
Antiguo 19/07/2011, 16:28
 
Fecha de Ingreso: julio-2011
Ubicación: Palma
Mensajes: 25
Antigüedad: 12 años, 9 meses
Puntos: 1
Respuesta: buscar el resultado que mas se ajuste de cada id

Haciendo lo siguiente consigo sacar el resultado que más se acerca al día buscado para el id=01

SELECT TOP 1 *
FROM Tbl_datos a
WHERE a.id = 01
ORDER BY a.dias ASC

pero como habría que hacerlo para el resto de id's?? ¿cómo habría que hacerlo para que vaya itinerando para las cuatro ciudades diferentes?

Saludos
  #3 (permalink)  
Antiguo 20/07/2011, 07:31
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: buscar el resultado que mas se ajuste de cada id

Que criterio usas para saber cuales son los dias mas cercanos??? 3 dias menos del dia que das??

Saludos!
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #4 (permalink)  
Antiguo 20/07/2011, 07:49
 
Fecha de Ingreso: julio-2011
Ubicación: Palma
Mensajes: 25
Antigüedad: 12 años, 9 meses
Puntos: 1
Respuesta: buscar el resultado que mas se ajuste de cada id

para los días más cercanos el criterio es que sea mayor o igual a los días buscados,

DECLARE @dias_buscados INT= 5

SELECT TOP 1 *
FROM Tbl_datos a
WHERE a.id = 01 AND a.dias>=@dias_buscados
ORDER BY a.dias ASC

saludos
  #5 (permalink)  
Antiguo 20/07/2011, 08:32
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: buscar el resultado que mas se ajuste de cada id

Hola ros0809

Podrías hacerlo más o menos así:

Código SQL:
Ver original
  1. DECLARE @Tbl_datos TABLE (id VARCHAR(2), nombre VARCHAR(15), dias INT, precio INT)
  2. INSERT INTO @Tbl_datos VALUES ('01', 'madrid', 3, 20)
  3. INSERT INTO @Tbl_datos VALUES ('01', 'madrid', 5, 25)
  4. INSERT INTO @Tbl_datos VALUES ('01', 'madrid', 7, 30)
  5. INSERT INTO @Tbl_datos VALUES ('01', 'madrid', 10, 35)
  6. INSERT INTO @Tbl_datos VALUES ('02', 'barcelona', 3, 15)
  7. INSERT INTO @Tbl_datos VALUES ('02', 'barcelona', 7, 19)
  8. INSERT INTO @Tbl_datos VALUES ('02', 'barcelona', 12, 25)
  9. INSERT INTO @Tbl_datos VALUES ('03', 'bilbao', 1, 7)
  10. INSERT INTO @Tbl_datos VALUES ('03', 'bilbao', 4, 9)
  11. INSERT INTO @Tbl_datos VALUES ('03', 'bilbao', 9, 10)
  12. INSERT INTO @Tbl_datos VALUES ('04', 'sevilla', 4, 10)
  13. INSERT INTO @Tbl_datos VALUES ('04', 'sevilla', 11, 20)
  14.  
  15. DECLARE @dias_buscados INT
  16. SET @dias_buscados = 5
  17. SELECT T1.* FROM @Tbl_datos T1 INNER JOIN
  18. (SELECT id, MIN(dias - @dias_buscados) diferencia FROM @Tbl_datos WHERE dias >= @dias_buscados GROUP BY id) T2
  19. ON T1.id = T2.id AND T1.dias = T2.diferencia + @dias_buscados

la idea de la cadena es obtener la menor diferencia para cada ciudad con respecto a los días buscados, de tal manera que si ejecutas sólo la subconsulta obtendrías una tabla como esta:

Código:
id   diferencia
---- -----------
01   0
02   2
03   4
04   6
una diferencia = 0 quiere decir que para es id existe un registro igual al número de dias buscado, por lo tanto en la tabla debe existir un registro con dias = a diferencia + días buscados...

Dale un vistazo para ver si te sirve y si encuentro alguna forma más fácil de llegar al resultado lo posteo por la tarde.

Saludos
Leo.
  #6 (permalink)  
Antiguo 20/07/2011, 09:24
 
Fecha de Ingreso: julio-2011
Ubicación: Palma
Mensajes: 25
Antigüedad: 12 años, 9 meses
Puntos: 1
Respuesta: buscar el resultado que mas se ajuste de cada id

me estaba liando y no sabía como podía hacer la subselect,
le he echado un vistazo al ejemplo que has posteado y funciona perfectamente!

muchas gracias leonardo_josue!!

Etiquetas: sql, sql-optimizar, bases-de-datos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:48.