我有一系列的抄表存储在一个表格中,每个抄表都由建筑物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
如果不存在先前的条目(即第一次阅读),我想在经过的时间和累积中重新运行零。
我非常感谢可以提供的任何帮助,我齐心协力在以前的帖子中找到答案但无济于事,如果其他地方已经解决了,请随时指导我找一个好的来源
谢谢
答案 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
以下是设计的工作原理:
NULL
s。NULL
,因此您需要COALESCE
函数将其更改为零。COALESCE
会将NULL
更改为零。除了在几天,几小时和几分钟内获得时间间隔并将其格式化之外,所有内容都在那里。祝你好运。