与先前数据的差异

时间:2019-03-15 20:43:55

标签: mysql sql

我有这张桌子:

CREATE TABLE datos ( 
    id_estacion smallint(6) DEFAULT NULL, 
    id_sensor smallint(6) DEFAULT NULL, 
    tipo_sensor smallint(6) DEFAULT NULL, 
    valor float DEFAULT NULL, 
    fecha date DEFAULT NULL, 
    hora time DEFAULT NULL, 
    id int(11) NOT NULL AUTO_INCREMENT, 
    dato float DEFAULT NULL, 
    PRIMARY KEY (id) 
) ENGINE=InnoDB AUTO_INCREMENT=8556 DEFAULT CHARSET=latin1; 

此数据:

id_estacion  fecha       hora      valor
1            2019-03-15  00:00:00  1164.63
1            2019-03-15  00:15:00  1164.63
1            2019-03-15  00:30:00  1164.64
1            2019-03-15  00:45:00  1164.62
1            2019-03-15  01:00:00  1164.67
1            2019-03-15  01:15:00  1164.63
1            2019-03-15  01:30:00  1164.64

我需要使用mysql计算数据与先前数据之间的差异。例如,'00:30'的值为1164.64'00:15'的上一个值为1164.63,差值为0.01

id_estacion  fecha      hora     valor    diferencia
1            3/15/2019  0:00:00  1164.63   0
1            3/15/2019  0:15:00  1164.63   0
1            3/15/2019  0:30:00  1164.64   0.01
1            3/15/2019  0:45:00  1164.62  -0.02
1            3/15/2019  1:00:00  1164.67   0.05
1            3/15/2019  1:15:00  1164.63  -0.04
1            3/15/2019  1:30:00  1164.64   0.01

有可能吗?希望你理解我。

最诚挚的问候

1 个答案:

答案 0 :(得分:0)

这是一个应在所有版本的MySQL上使用的解决方案。 原理是使用JOIN条件自我NOT EXISTS表,以引入同一id_estacion的先前记录。

SELECT
    t.id_estacion,
    t.fetcha,
    t.hora,
    t.valor,
    COALESCE(t.valor - tprev.valor, 0) diferencia
FROM mytable t
LEFT JOIN mytable tprev 
    ON  tprev.id_estacion = t.id_estacion
    AND CONCAT(tprev.fecha, ' ', tprev.hora) < CONCAT(t.fecha, ' ', t.hora)
    NOT EXISTS (
        SELECT 1 FROM mytable t1 
        WHERE 
            t1.id_estacion = t.id_estacion 
            AND CONCAT(t1.fecha, ' ', t1.hora) < CONCAT(t.fecha, ' ', t.hora)
            AND CONCAT(t1.fecha, ' ', t1.hora) > CONCAT(tprev.fecha, ' ', tprev.hora)
    )

注意:我建议不要将日期和时间部分存储在单独的列中,因为这只会使事情变得更复杂。相反,您可以使用数据类型为DATETIME的唯一列,并在需要提取其中一部分时使用MySQL date and time functions