2010-11-04 46 views
2

我有一系列存储在表抄表的两个条目之间的差异,各由建筑ID,一个计ID,并在它被记录的时间确定。使用MySQL计算同一表

对于每个条目,我想搜索具有相同ID号和最接近的前一次的条目,然后我想使用前一次和以前的读数来计算时间步的长度和两次读数之间的差异。

所以,我目前有:

BuildingID | MeterID | Date_and_Time | Reading

,我想制作:

BuildingID | MeterID | Date_and_Time | Time_Since_Previous_Read | Accumulation_Since previous_Read

两个典型的条目可能是这样的:

1 | 1 | 2010-10-09 17:56:20 | 119.6

1 | 1 | 2010-10-09 18:01:08 | 157.4

,我想制作:

1 | 1 | 2010-10-09 18:01:08 | 00:04:48 | 37.8

如果没有前面的项存在(即对于第一次阅读)我想重新运行零时间和积累。

我非常感谢能为此提供的任何帮助,我一致努力在以前的帖子中找到答案,但无济于事,随时指导我获得一个良好的来源,如果这已经解决了别处。

谢谢

回答

0

也许这样吗?

SELECT a.BuildingID, a.MeterID, a.Date_and_Time, 
    a.Date_and_Time-b.Date_and_Time AS `Time_Since_Previous_Read`, 
    a.Reading-b.Reading AS `Accumulation`, 
    MAX(b.Date_and_Time) AS `otherdateandtime` 
FROM `TABLENAME` AS `a`, `TABLENAME` AS `b` 
WHERE a.BuildingID = b.BuildingID AND a.MeterID = b.MeterID 
    AND a.Date_and_Time>b.Date_and_Time 
GROUP BY `a.Date_and_Time` 
+0

谢谢你的帮助,不幸的是似乎没有为我工作,它会产生结果,但他们很奇怪,我认为不准确(与我正在寻找什么)。我修改了一下,以便将特定的表和列名称炒到: – 2010-11-04 17:57:31

+0

'SELECT a.BuildingID,a.MeterID,a.DateTime, timediff(a.DateTime,b.DateTime)AS'Time_Since_Previous_Read', a。 Value-b.Value AS'Accumulation', MAX(b.DateTime)AS'otherdateandtime' FROM'meterdata_test' as'a','meterdata_test' AS'b' WHERE a.BuildingID = b.BuildingID AND a。 MeterID = b.MeterID AND a.DateTime> b.DateTime GROUP BY BuildingID&MeterID' – 2010-11-04 17:58:57

0

试试这个:

/* 1*/SELECT 
/* 2*/ r_B.BuildingID, 
/* 3*/ r_B.MeterID, 
/* 4*/ r_B.Date_and_Time, 
/* 5*/ COALESCE(DATEDIFF(hh, r_A.Date_and_Time, r_B.Date_and_Time), 0) AS Time_Since_Previous_Read, 
/* 6*/ COALESCE(r_B.Reading-r_A.Reading, 0) AS Accumulation_Since_Previous_Read 
/* 7*/ FROM meterdata r_B 
/* 8*/ LEFT OUTER JOIN meterdata r_A 
/* 9*/ ON r_B.BuildingID = r_A.BuildingID AND r_B.MeterID = r_A.MeterID AND r_B.Date_and_Time > r_A.Date_and_Time 
/*10*/ WHERE NOT EXISTS (SELECT nonelater.Date_and_Time FROM meterdata nonelater WHERE nonelater.BuildingID = r_B.BuildingID AND nonelater.MeterID = r_B.MeterID AND nonelater.Date_and_Time > r_A.Date_and_Time AND nonelater.Date_and_Time < r_B.Date_and_Time) 
/*11*/ORDER BY r_B.BuildingID, r_B.MeterID, r_B.Date_and_Time 

这里的设计是如何工作的:

  • 线7和8:查询的核心是在一个自联接米数据表。您需要这样才能找到一行中的值与另一行中的值之间的差异。 r_B是后者,r_B是前者。
  • 第8行:使它成为左外部联接意味着即使没有更早的r_A行,它也可以工作;那部分连接将返回NULL s。
  • 第9行:此约束联接只为同一建筑物和仪表连接行,并确保两行是正确的方式。
  • 第10行:如果您不再更改连接,则应将每个r_B行加入到每一行过去行中。为确保r_B仅与最近的过去行匹配,此行检查是否没有比r_A更近的另一行。
  • 第6行:这个计算的读数差值为;如果没有较早的r_A行,则此计算将返回NULL,因此需要使用COALESCE函数将其更改为零。
  • line 5,它找到时间间隔做同样的事情。对于这个演示,我已经使用了SQL Server DATEDIFF函数,它不会给你想要的东西,因为在MySQL上它只有一个选项,可以计算天数的差异;您也许可以使用INTERVAL函数。同样,如果没有一行r_A,则COALESCE将把NULL更改为零。

除了以天,小时和分钟为单位获得时间间隔并很好地格式化之外,所有内容都是如此。祝你好运。