SQL que coja el valor del registro y el del anterior

Buenas,

tengo una tabla sencilla, con los campos:
    fecha (unixtime)
    valor

Me interesa saleccionar la fecha, valor y la diferencia entre el valor de ese registro y su anterior (están ordenados por fecha, pero no equiespaciados, con lo cual es casi aleatorio). No hay un ID ni clave principal.

¿alguna idea?

Gracias!
¿Estas usando algún lenguaje aparte de SQL?
Podrías volcar el contenido a una estructura de memoria y jugar en memoria realizando las operaciones que deseas - diferencia en este caso - y después mostrar ese contenido.

Mediante el lenguaje SQL aquí tienes un posible inicio:
http://www.forosdelweb.com/f21/resta-do ... ql-226986/

Un saludo,
¿Qué parámetro usas para seleccionar la línea concreta?
Entiendo que usas el unixtime como clave primaria o cómo índice.

Si seleccionas la línea usando por ejemplo (en mysql):
SELECT fecha,valor FROM tabla WHERE fecha=XXX;

Entonces podrías seleccionar (creo [+risas] ) la fila anterior a la que necesitas:
SELECT fecha,valor FROM tabla WERE fecha = (SELECT MAX(fecha) FROM Tabla WHERE fecha < XXX);
O la siguiente:
SELECT fecha,valor FROM tabla WERE fecha = (SELECT MIN(fecha) FROM Tabla WHERE fecha > XXX);

También podrías hacerlo con offsets.

Un saludo.
Haz en php por ejemplo un array con el select * from TABLA, y de ahi ya haces lo que quieres es mas sencillo, de todas formas una tabla sin ID es un error.
@Newton, @jose91.

Uso PHP, y sé resolverlo apoyándome en ellos, pero es un reto sacarlo con SQL puro.
Ya sé que no tener clave principal no es bueno, pero esa tabla debería tener una clave principal que fuera combinación de varios campos (no vale con uno solo), y no me mola.

@GhOsHe,

No puedo usar el unixtime como PK porque hay más variables en esa tabla que pueden tener valores en el mismo instante.

Probaré lo que has dicho y miraré lo de los offsets, que ni idea de lo que son.

Gracias a todos! [oki]
Quizás algo así (mysql)?
SELECT fecha, valor,
valor - (SELECT valor FROM tabla ORDER BY fecha DESC LIMIT 1 OFFSET 1 ) AS dif
FROM tabla ORDER BY fecha DESC LIMIT 1
WaterDark escribió:Quizás algo así (mysql)?
SELECT fecha, valor,
valor - (SELECT valor FROM tabla ORDER BY fecha DESC LIMIT 1 OFFSET 1 ) AS dif
FROM tabla ORDER BY fecha DESC LIMIT 1


Casi, pero no. Eso me hace la resta siempre del mismo valor, porque OFFSET es constante. En todo caso, gracias por la ayuda [oki]

Posteo la solución por si a alguien le es útil:

SELECT fecha, valor,
valor - (SELECT valor FROM datos WHERE fecha < t.fecha ORDER BY fecha DESC LIMIT 1) AS diferencia
FROM datos AS t


Gracias a todos! [beer]
banderas20 escribió:
WaterDark escribió:Quizás algo así (mysql)?
SELECT fecha, valor,
valor - (SELECT valor FROM tabla ORDER BY fecha DESC LIMIT 1 OFFSET 1 ) AS dif
FROM tabla ORDER BY fecha DESC LIMIT 1


Casi, pero no. Eso me hace la resta siempre del mismo valor, porque OFFSET es constante. En todo caso, gracias por la ayuda [oki]

Posteo la solución por si a alguien le es útil:

SELECT fecha, valor,
valor - (SELECT valor FROM datos WHERE fecha < t.fecha ORDER BY fecha DESC LIMIT 1) AS diferencia
FROM datos AS t


Gracias a todos! [beer]

Para ese caso concreto sirve ese apaño que has hecho, pero para hacer esto de escoger un registro y el siguiente (o anterior), se usa LEAD y LAG. Yo tuve que usarlo en un trabajo hace poco y me tuve que romper los morros un par de días hasta conseguir la consulta que me pedían de otros departamentos.
aikidoka90 escribió:Para ese caso concreto sirve ese apaño que has hecho, pero para hacer esto de escoger un registro y el siguiente (o anterior), se usa LEAD y LAG. Yo tuve que usarlo en un trabajo hace poco y me tuve que romper los morros un par de días hasta conseguir la consulta que me pedían de otros departamentos.


Ostras. No tenía ni idea de estas sentencias. Le echaré un vistazo. Gracias!
8 respuestas