我有一些电表连接到一个PLC (可编程控制器)。
可编程控制器在24小时内对仪表上的kWh脉冲进行计数(集成)。
伯爵在午夜被重置。
当前计数值每秒钟记录到一个表中。
我需要在每15分钟内检索一米的kWh总数。
例如:
Meter count at 11:00:00 = 1000
Meter count at 11:14:59 = 1110
Meter count at 11:29:59 = 1200
Meter count at 11:59:59 = 140015分钟kWh总计:
At 11:14:59 = 110
At 11:29:59 = 90
At 11:59:59 = 200 基本上,我想从前15分钟的计数中减去15分钟的计数。
数据库是MSSQLServer。
是否可以使用select查询返回上述内容。
我需要将这些数据导出到csv文件中。
发布于 2014-06-06 15:12:22
我认为CTE和self join足以达到预期的效果:
--constructing ID
WITH vPLC as (select *, ROW_NUMBER() OVER (order by date) as recID
from @PLC
)
select vPLC.*, COALESCE( vPLC.value - n.Value, 0 ) as diffVal
from vPLC
left JOIN vPLC n on n.recID = vPLC.recID - 1
----------OUTPUT----------
recId date value diffVal
1 6/5/2014 11:00:00 AM 1000 0
2 6/5/2014 11:14:59 AM 1110 110
3 6/5/2014 11:29:59 AM 1200 90
4 6/5/2014 11:59:59 AM 1400 200证明代码在这里
发布于 2014-06-10 19:57:53
我把这作为一个分开的答案发布,因为它使用了一个不同的方法来解决这个问题,如果这不是正确的事情,我将编辑我以前的答案来添加这个答案。
为了得到结果,就像在问题中一样,可以利用数据的一个固有属性:消耗的kW是不递减的,这意味着最小值总是第一个,最大值永远是每个块的最后一个。
使用这些属性的快速和脏查询是
SELECT MAX(_Time) _Time
, BlockConsume = MAX(KWh) - MIN(KWh)
FROM UtilityMeter
GROUP BY DateDiff(mi, 0, _Time) / 15
ORDER BY _Time该组锚点在精确时刻点发生变化,MAX(_Time)将是一个精确季度之前的最后一个值: 14.59,29.59,44.59,59.99。
查询工作,但这是一个表扫描,以获得更快一点,可以删除所有未使用的数据,通过过滤掉所有的898个(15*60-2)行,这些行不是一个组的最后一个行
WITH Quarter AS (
SELECT _Time, KWh
, DateDiff(mi, 0, _Time) / 15 Block
FROM UtilityMeter
WHERE DateDiff(s, 0, _Time) % (900) IN (0, 899)
)
SELECT MAX(_Time) _Time
, BlockConsume = MAX(KWh) - MIN(KWh)
FROM Quarter
GROUP BY Block
ORDER BY _Timehttps://stackoverflow.com/questions/24084400
复制相似问题