2011-01-26 68 views
1

我有一个MYSQL表,用于存储我家中太阳能发电的数据。我有两个逆变器设备,包括本表中的数据。为了简化,我的表结构(有说明)的相关部分是一样的东西:查找未连续存储的SQL记录之间的差异

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

+1使用太阳能。 – Quassnoi 2011-01-26 16:29:01

回答

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)上创建一个复合索引,以便快速工作。

还应该支持柴油发电机(未测试)。

+0

+1支持柴油发电机组。 :-) – 2011-01-26 16:28:15

0

难道你只是说
WHERE t1.created_at = t2.created_at

或者我不明白你的问题:$