我有这张桌子:
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
有可能吗?希望你理解我。
最诚挚的问候
答案 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。