我有一个MYSQL表,用于存储我家的太阳能发电数据。我正在轮询的两个逆变器设备包含此表中的数据。为简化起见,我的表结构的相关部分(包括描述)类似于:
id <auto_increment>
addr <int address of the inverter>
etotal <total generation since the device has been online>
我试图找到连续记录每个逆变器之间的区别,这样我就可以知道在记录之间(或者我最终选择的任何时间段)之间产生了多少能量。如果记录被一致地插入,我可以做类似的事情:
SELECT (t2.etotal - t1.etotal) AS eperiod
FROM solars AS t1, solars AS t2
WHERE t1.id+2 = t2.id AND t1.created_at >= CURDATE()
AND t1.addr = 245 AND t2.addr = 245 ORDER BY t1.id;
然而,这并不总是如期望的那样起作用,而且似乎是一个糟糕的选择。我唯一的另一个想法是选择一个具有自动递增id的临时表,然后从该表中进行类似的选择。如果可能,对单个查询解决方案感兴趣。
答案 0 :(得分:3)
SELECT @ptotal - etotal, @ptotal := etotal
FROM solars
WHERE created_at >= CURDATE()
AND addr = 245
ORDER BY
created_at, id
在处理结果时忽略第二列或将其包装到嵌套查询中(虽然它可能稍慢):
SELECT diff
FROM (
SELECT @ptotal - etotal AS diff, @ptotal := etotal
FROM solars
WHERE created_at >= CURDATE()
AND addr = 245
ORDER BY
created_at, id
) q
在(addr, created_at, id)
上创建一个复合索引,以便快速工作。
还应支持柴油发电机(未经测试)。
答案 1 :(得分:0)
你能不能说出来
WHERE t1.created_at = t2.created_at
?
或者我不明白你的问题:$