使用MySQL计算同一个表中两个条目之间的差异

时间:2010-11-04 16:37:04

标签: mysql

我有一系列的抄表存储在一个表格中,每个抄表都由建筑物ID,仪表ID和记录时间来识别。

对于每个条目,我想搜索具有相同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

如果不存在先前的条目(即第一次阅读),我想在经过的时间和累积中重新运行零。

我非常感谢可以提供的任何帮助,我齐心协力在以前的帖子中找到答案但无济于事,如果其他地方已经解决了,请随时指导我找一个好的来源

谢谢

2 个答案:

答案 0 :(得分: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`

答案 1 :(得分: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行:查询的核心是meterdata表上的 self-JOIN 。您需要能够找到一行中的值与另一行中的值之间的差异。 r_B是后一个,r_B是较早的一个。
  • 第8行:将其设为 LEFT OUTER JOIN 表示即使没有较早的r_A行也能正常工作;该部分联接将返回NULL s。
  • 第9行:此约束JOIN 仅连接同一建筑物和仪表的行,并确保这两行是正确的方式。
  • 第10行:如果您不再更改联接,则每个r_B行都会加入到过去的每一行。要确保 r_B仅与最近的最近一行匹配,此行会检查没有比r_A更新的行。
  • 第6行:这会计算读数之间的差异;如果没有较早的r_A行,此计算将返回NULL,因此您需要COALESCE函数将其更改为零。
  • 第5行时,找到时间间隔也是一样的。对于这个演示,我使用了SQL Server DATEDIFF函数,它不会给你你想要的东西,因为在MySQL上它只有一个选项来计算天数差异;您也许可以使用INTERVAL功能。同样,如果没有行r_A,则COALESCE会将NULL更改为零。

除了在几天,几小时和几分钟内获得时间间隔并将其格式化之外,所有内容都在那里。祝你好运。