SQL - Consulta de resgitro mas cercano

 
Vista:
Imágen de perfil de Jhoxan

Consulta de resgitro mas cercano

Publicado por Jhoxan (5 intervenciones) el 17/03/2016 21:58:37
Buenas tardes

Tengo un inconveniente con una consulta. Debo generar una consulta que me evalue dentro de un rango de fechas y devuelva los registro que esten dentro del rango, en caso contrario de no haber, que busque el registro mas cercano a la fecha que estan en lo rango.

mi tabla tiene

trabajador / Salario / Fecha
1----------------1000-----01-01-2016
1---------------- 800 -----01-10-2015
2---------------- 500 -----01-02-2016
2---------------- 550 -----15-02-2016
3---------------- 600 -----01-02-2016
4---------------- 100 -----01-11-2015
4---------------- 50 -----01-05-2015

mi consulta

select * from tabla where fecha between '01-02-2016' and '31-02-2016'

resultado obtenido

trabajador / Salario / Fecha
2 ---------------- 500----- 01-02-2016
2---------------- 550----- 15-02-2016
3 ---------------- 600 ----- 01-02-2016


resultado esperado


trabajador / Salario / Fecha
1----------------1000----- 01-01-2016
2 ---------------- 500----- 01-02-2016
2 ----------------550----- 15-02-2016
3 ----------------600 ----- 01-02-2016
4----------------100----- 01-11-2015
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
Imágen de perfil de Isaias
Val: 2.542
Oro
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Consulta de resgitro mas cercano

Publicado por Isaias (1921 intervenciones) el 18/03/2016 00:48:21
¿En que motor de base de datos?
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
Imágen de perfil de Jhoxan

Consulta de resgitro mas cercano

Publicado por Jhoxan (5 intervenciones) el 18/03/2016 14:03:14
SQl server 2008 R2
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
Imágen de perfil de Jordi

Consulta de resgitro mas cercano

Publicado por Jordi (10 intervenciones) el 18/03/2016 14:33:26
Hola Jhoxan,

No entiendo exactamente el problema. La consulta que estás introduciendo cuadra con el resultado obtenido. El resultado esperado para esa consulta según lo que comentas, no tiene sentido. ¿Cómo te va a devolver registros de otros meses si le estás pidiendo los de febrero de 2016?
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
Imágen de perfil de Jhoxan

Consulta de resgitro mas cercano

Publicado por Jhoxan (5 intervenciones) el 18/03/2016 14:39:17
Buenas ...

Esa es la consulta que estoy realizando y el resultado esta correcto si necesitara solo esos trabajadores. Pero en realidad necesito que me muestre a todos los trabajadores que tenga en mi BD. Y como explique en el planteamiento del problema, en caso de que la busqueda no este dentro del rango, que busque el resultado mas cercano. Por eso es que en el resultado esperado si te fijas tiene la fecha mas cercana a la que esta en la consulta.
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
Imágen de perfil de Isaias
Val: 2.542
Oro
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Consulta de resgitro mas cercano

Publicado por Isaias (1921 intervenciones) el 18/03/2016 17:43:50
Como dice Jordi, el motor de base de datos, no es "adivina" de que tu quieras las fechas "cercanas", desde el momento que esta colocando tu filtro (WHERE), estas definiendo que deseas obtener.

Ahora bien, si el resultado que te da, no es el esperado, pues entonces, vuelves a ejecutar tu query con un filtro diferente.
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
Imágen de perfil de Jhoxan

Consulta de resgitro mas cercano

Publicado por Jhoxan (5 intervenciones) el 18/03/2016 20:13:09
Claro eso lo comprendo, ahora bien pregunto, no habra una manera o sentencia que pueda adicionar a este query para que en el caso de encontrar nada dentro del rango me traiga la el resultado mas cercano?
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
Imágen de perfil de Isaias
Val: 2.542
Oro
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Consulta de resgitro mas cercano

Publicado por Isaias (1921 intervenciones) el 18/03/2016 20:49:00
Amigo, no se para que proposito quieras los "datos mas cercanos" y te pongo un ejemplo

Yo deseo consultar las ventas del 15 de Enero de 2016 al 15 de Febrero de 2016, como no HAY NADA, entonces tomo la decision de traer las ventas "mas cercanas" a ese rango de fechas y me traigo las del 15 de Noviembre de 2015 al 15 de Diciembre de 2015.

¿Para que?

Digo, eso me confundiria como usuario, ¿no?

Explica mejor tu caso.
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
Imágen de perfil de Jhoxan

Consulta de resgitro mas cercano

Publicado por Jhoxan (5 intervenciones) el 18/03/2016 20:59:22
Ok.

El usuario me esta pidiendo un reporte que traiga los salarios de los trabajadores segun el rango de fechas. Si por ejemplo dentro del rango de fecha hay algun trabajador que haya tenido por lo minimo un cambio de salario en la consulta que estoy realizando(con el rango) me lo va a traer. Pero ahora bien, tambien el usuario me esta diciendo, que adicionalmente a los trabajadores que estan dentro del rango, me traiga tambien el salario mas cercano a la fecha que estoy colocando dentro del rango. Por eso es que mi consulta para trabajadores que estan dentro del rango esta bien, estoy es buscando una solucion o sentencia que me permita traer aquellos trabajadores que no estan dentro del rango con su salario.

Espero haberme explicado y que me puedan ayudar con este caso
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
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

Consulta de resgitro mas cercano

Publicado por leonardo_josue (1173 intervenciones) el 18/03/2016 22:41:59
Hola Jhoxan:

Lo que planteas difícilmente lo vas a poder lograr con una consulta simple, por lo que te planteo que mejor pienses en hacer un SP para tal propósito.

Creo que antes de poder darte una respuesta, lo que debes decirnos es ¿cómo determinas que una fecha es la más cercana al rango?

En realidad hay varias formas de plantear lo que necesitas, pero se me ocurre que en lugar de verificar si una fecha está entre el rango mencionado, calcules cuántos días hay de diferencia entre la fecha de tu tabla y cada uno de los rangos que mencionas... utilizando la función DATEDIFF... debes tener cuidado de manejar sólo valores absolutos, pues si la función cambia de signo si dependiendo de qué fecha sea mayor, si la inicial o la final...

De tal suerte, que una vez obtenidas las diferencias de edades entre las dos fechas, debes tomar la menor de ellas y la MINIMA de todas
las agrupadas para cada trabajador... con tu ejemplo para el trabajador 4, tendrías algo como esto;

1
2
3
4
5
6
7
8
9
10
11
select
  fecha, trabajador,salario,
  abs(datediff(day, '2016-02-01', fecha)) diferencia_inicial,
  abs(datediff(day, '2016-02-29', fecha)) diferencia_final
from tabla
where trabajador = 4;
 
fecha       |trabajador  |salario   |diferencia_inicial  |diferencia_final
------------|------------|----------|--------------------|-----------------
2015-01-11  |4           |100       |386                 |414
2015-01-05  |4           |50        |392                 |420

entonces, la diferencia mínima "total" es 386 días, que corresponde al salario = 100.

Espero que se entienda la idea.

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
sin imagen de perfil

Consulta de resgitro mas cercano

Publicado por DAVID (23 intervenciones) el 22/03/2016 07:48:08
Hola Jhoxan,
vas a tener que hacer un procedimiento almacenado donde podrás colocar los if que comentas en tu enunciado, porque con una sentencia SELECT, lo veo complicado. Mínimo deberías usar 2. Una con el rango de fechas, y si no devuelve registros, pues haces las segunda con los nuevos rangos de fechas.

Un saludo,
David
estudio de diseño grafico
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