SQL - Registro Anterior en una consulta entre fecha

   
Vista:
Imágen de perfil de Jorge Andres

Registro Anterior en una consulta entre fecha

Publicado por Jorge Andres jorge01165moreira@gmail.com (6 intervenciones) el 08/01/2014 00:25:57
tengo un pequeño problema, no se como hacer para que la consulta que estoy haciendo me muestre el registro anterior,

estos serian los campos que utilizo

idmaquina,
FechaDocumento,
Lectura,
Galones.

hago la consulta mediante la fecha>=04/12/2013 y <=.07/01/2014

Los datos pare el ejemplo son estos: lo que quiero calcular seria la lectura anterior para ver cuantos kilometros recorrio:

Idmaquina FechaDocumento Lectura Galones Lectura Anterios
22002 09/12/2013 115.695,00 15,52
22002 10/12/2013 115.867,00 4,28
22002 16/12/2013 116.374,00 11,32
22002 20/12/2013 116.649,00 6,35
22002 24/12/2013 117.071,00 9,62
22002 27/12/2013 117.452,00 9,01
22002 06/01/2014 117.755,00 7,50

Este seria el registro anterior
22002 03/12/2013 114.995,00 11,20

si me pudieran ayudar... muchas gracias
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 xve

Registro Anterior en una consulta entre fecha

Publicado por xve (238 intervenciones) el 08/01/2014 07:38:17
Hola Jorge, creo que seria algo así para MySQL:
1
SELECT * FROM tabla WHERE FechaDocumento<'2013/12/04' ORDER BY FechaDocumento DESC LIMIT 1

Lo que hacemos, es buscar los registros anteriores a la fecha, ordenarlos descendente y coger el primero.

Coméntanos si te sirve, ok?
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

Registro Anterior en una consulta entre fecha

Publicado por Isaias (691 intervenciones) el 08/01/2014 16:39:19
Dependera de que motor de base de datos este usando, por ejemplo, LIMIT no sirve para SQL Server
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 Jorge Andres

Registro Anterior en una consulta entre fecha

Publicado por Jorge Andres (6 intervenciones) el 08/01/2014 20:28:16
Disculpen estoy usando SQL Server 2012.
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 Jorge Andres

Registro Anterior en una consulta entre fecha

Publicado por Jorge Andres (6 intervenciones) el 08/01/2014 22:44:27
este codigo me funciono,

SELECT TOP 1
Lectura
FROM
tabla
Where
(FechaDocumento< '2013/12/04 ')
ORDER BY FechaDocumento DESC

Me da el dato que ando buscando, pero yo quiero integrarlo a otra consulta para calcular lo recorrido.
Algo asi deberia de quedar.

Id Maquina Fecha Documento Lectura Anterior Lectura Recorrido
22,002 09/12/2013 114,995.00 115,695.00 700.00
22,002 10/12/2013 115,695.00 115,867.00 172.00
22,002 16/12/2013 115,867.00 116,374.00 507.00
22,002 20/12/2013 116,374.00 116,649.00 275.00
22,002 24/12/2013 116,649.00 117,071.00 422.00
22,002 27/12/2013 117,071.00 117,452.00 381.00
22,002 06/01/2014 117,452.00 117,755.00 303.00
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

Registro Anterior en una consulta entre fecha

Publicado por leonardo_josue (880 intervenciones) el 10/01/2014 21:44:55
Hola Jorge Andrés:

En realidad hay muchas formas de obtener lo que quieres, una de las que creo es de las más simples es con JOIN's... el truco está en considerar dos veces la misma tabla (con un alias) y unirlas con un JOIN, pero en lugar de hacer que se una con la misma lectura lo haces con la lectura posterior... en palabras suena algo complicado, observa el ejemplo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
mysql> SELECT * FROM tabla;
+-----------+----------------+---------+---------+
| Idmaquina | FechaDocumento | Lectura | Galones |
+-----------+----------------+---------+---------+
|     22002 | 2013-12-09     |  115695 |   15.52 |
|     22002 | 2013-12-10     |  115867 |    4.28 |
|     22002 | 2013-12-16     |  116374 |   11.32 |
|     22002 | 2013-12-20     |  116649 |    6.35 |
|     22002 | 2013-12-24     |  117071 |    9.62 |
|     22002 | 2013-12-27     |  117452 |    9.01 |
|     22002 | 2014-01-06     |  117755 |    7.50 |
+-----------+----------------+---------+---------+
7 rows in set (0.00 sec)
 
mysql> SELECT
    ->    T1.idmaquina,
    ->    T1.fechadocumento,
    ->    T1.lectura lectura_actual,
    ->    MAX(T2.lectura) lectura_anterior,
    ->    T1.lectura - MAX(T2.lectura) recorrido
    -> FROM tabla T1
    -> LEFT JOIN tabla T2 ON T1.idmaquina = T2.idMaquina AND
    ->                       T2.lectura < T1.lectura
    -> GROUP BY T1.idmaquina, T1.fechadocumento, T1.lectura;
+-----------+----------------+----------------+------------------+-----------+
| idmaquina | fechadocumento | lectura_actual | lectura_anterior | recorrido |
+-----------+----------------+----------------+------------------+-----------+
|     22002 | 2013-12-09     |         115695 |             NULL |      NULL |
|     22002 | 2013-12-10     |         115867 |           115695 |       172 |
|     22002 | 2013-12-16     |         116374 |           115867 |       507 |
|     22002 | 2013-12-20     |         116649 |           116374 |       275 |
|     22002 | 2013-12-24     |         117071 |           116649 |       422 |
|     22002 | 2013-12-27     |         117452 |           117071 |       381 |
|     22002 | 2014-01-06     |         117755 |           117452 |       303 |
+-----------+----------------+----------------+------------------+-----------+
7 rows in set (0.00 sec)

Observa que en el ON existen dos condiciones;

1
2
ON T1.idmaquina = T2.idMaquina AND
    T2.lectura < T1.lectura

al utilizar una condición (<) puedes unir más de un registro... así, si tomamos por ejemplo la lectura 117755 que es la máxima, todas las demás lecturas son menores a ellas, pero la última DEBE SER LA MÁS GRANDE, o lo que es lo mismo LA MÁXIMA LECTURA de todas las lecturas que sean menores a 117755, observa qué pasa si no colocas el GROUP BY y el MAX

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
mysql> SELECT
    ->    T1.idmaquina,
    ->    T1.fechadocumento,
    ->    T1.lectura lectura_actual,
    ->    T2.lectura lectura_actual
    -> FROM tabla T1
    -> LEFT JOIN tabla T2 ON T1.idmaquina = T2.idMaquina AND
    ->                       T2.lectura < T1.lectura
    -> ORDER BY T1.idMaquina, T1.fechadocumento, T1.lectura;
+-----------+----------------+----------------+----------------+
| idmaquina | fechadocumento | lectura_actual | lectura_actual |
+-----------+----------------+----------------+----------------+
|     22002 | 2013-12-09     |         115695 |           NULL |
|     22002 | 2013-12-10     |         115867 |         115695 |
|     22002 | 2013-12-16     |         116374 |         115867 |
|     22002 | 2013-12-16     |         116374 |         115695 |
|     22002 | 2013-12-20     |         116649 |         115867 |
|     22002 | 2013-12-20     |         116649 |         116374 |
|     22002 | 2013-12-20     |         116649 |         115695 |
|     22002 | 2013-12-24     |         117071 |         116649 |
|     22002 | 2013-12-24     |         117071 |         115867 |
|     22002 | 2013-12-24     |         117071 |         116374 |
|     22002 | 2013-12-24     |         117071 |         115695 |
|     22002 | 2013-12-27     |         117452 |         115695 |
|     22002 | 2013-12-27     |         117452 |         116649 |
|     22002 | 2013-12-27     |         117452 |         117071 |
|     22002 | 2013-12-27     |         117452 |         115867 |
|     22002 | 2013-12-27     |         117452 |         116374 |
|     22002 | 2014-01-06     |         117755 |         115695 |
|     22002 | 2014-01-06     |         117755 |         116649 |
|     22002 | 2014-01-06     |         117755 |         117071 |
|     22002 | 2014-01-06     |         117755 |         117452 |
|     22002 | 2014-01-06     |         117755 |         115867 |
|     22002 | 2014-01-06     |         117755 |         116374 |
+-----------+----------------+----------------+----------------+
22 rows in set (0.00 sec)

Espero que quede claro el funcionamiento de la consulta, si continuas con problemas nos lo comentas y lo revisamos.

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
Imágen de perfil de Jorge Andres

Registro Anterior en una consulta entre fecha

Publicado por Jorge Andres (6 intervenciones) el 11/01/2014 18:56:49
me funciono, muchas gracias por la ayuda...
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 Jorge Andres

Registro Anterior en una consulta entre fecha

Publicado por Jorge Andres (6 intervenciones) el 21/01/2014 19:11:20
Hola leonardo_josue, ahora necesito hacer la suma de los kilómetros recorridos para sacar el total de kilómetros recorrido entre fechas y el total de días entre fecha para poder saber cuantos kilómetros recorre arpoximadamente por dia, pero me da un error (No puede realizar una función de agregado en una expresión que contiene un agregado o una subconsulta.) ya que estoy haciendo lo siguiente:

mysql> SELECT
-> T1.idmaquina,
-> Max(T1.fechadocumento)-Min(T1.fechadocumento) Dias,
-> Max(T1.lectura lectura_actual),
-> Sum(T1.lectura - MAX(T2.lectura)) recorrido
-> (Sum(T1.lectura - MAX(T2.lectura)))/Max((T1.fechadocumento)-Min(T1.fechadocumento))
-> FROM tabla T1
-> LEFT JOIN tabla T2 ON T1.idmaquina = T2.idMaquina AND
-> T2.lectura < T1.lectura
-> GROUP BY T1.idmaquina

por tu ayuda muchas 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