基于PLC温度数据统计任意温区低温时长的变量累加方法
问题描述
我有一张从PLC读取数据的EVENT_DATA表,包含n个温区标签('TempZone1','TempZone2','TempZone3'等),每5秒更新一次各温区的温度数据,数据结构如下:
| DateTime | TagName | DataValue |
|---|---|---|
| 2024-02-01 07:00:05 | TempZone1 | 371 |
| 2024-02-01 07:00:05 | TempZone2 | 379 |
| 2024-02-01 07:00:05 | TempZone3 | 368 |
| 2024-02-01 07:00:10 | TempZone1 | 369 |
| 2024-02-01 07:00:10 | TempZone2 | 380 |
| 2024-02-01 07:00:10 | TempZone3 | 367 |
需求是统计任意一个TempZone温度<370的总时长:同一DateTime时间点内,即使有多个温区温度低于370,也仅按5秒计算。
当前代码会按每个温区分别统计,得到的总时长为15秒,但实际只需要统计为10秒。现有代码如下:
TotalColdMin= (1+datediff(mi,z.lo_date,z.hi_date))*(issues/convert(real,evt))
其中lo_date = 'mm/dd/yyy 07:00:00',hi_date = 'mm/dd/yyyy 07:59:59',issues的计算方式为:
issues= sum(case when datavalue < 370.0 then 1 else 0 end)
我不需要区分具体哪个温区触发,也不关心同一时间点的触发数量,只需统计存在温区低温的总时长,求正确的实现方法。
解决方案
核心思路是先按DateTime分组,判断每个时间点是否存在至少一个温区温度低于370,再统计符合条件的时间点数量,最后乘以每个时间点的间隔(5秒)得到总时长。
步骤1:统计存在低温的有效时间点数量
通过分组判断每个时间点是否满足低温条件,避免重复统计同一时间点的多个温区:
SELECT COUNT(DISTINCT DateTime) AS valid_time_points FROM EVENT_DATA WHERE DateTime BETWEEN z.lo_date AND z.hi_date AND EXISTS ( SELECT 1 FROM EVENT_DATA ed2 WHERE ed2.DateTime = EVENT_DATA.DateTime AND ed2.DataValue < 370.0 )
或者用分组聚合的方式实现:
SELECT SUM(has_low_temp) AS valid_time_points FROM ( SELECT DateTime, MAX(CASE WHEN DataValue < 370.0 THEN 1 ELSE 0 END) AS has_low_temp FROM EVENT_DATA WHERE DateTime BETWEEN z.lo_date AND z.hi_date GROUP BY DateTime ) AS time_point_check
步骤2:计算总时长
每个有效时间点对应5秒,转换为分钟即可得到最终结果:
-- 总时长(秒) TotalColdSeconds = valid_time_points * 5 -- 总时长(分钟) TotalColdMin = (valid_time_points * 5) / 60.0
整合后的完整SQL
替换原有issues的计算逻辑,直接得到正确的总时长:
DECLARE @valid_time_points INT; SELECT @valid_time_points = COUNT(DISTINCT DateTime) FROM EVENT_DATA WHERE DateTime BETWEEN z.lo_date AND z.hi_date AND EXISTS ( SELECT 1 FROM EVENT_DATA ed2 WHERE ed2.DateTime = EVENT_DATA.DateTime AND ed2.DataValue < 370.0 ); TotalColdMin = (@valid_time_points * 5) / 60.0;
逻辑验证
用示例数据测试:
- 2024-02-01 07:00:05:存在低温温区,计1个有效时间点
- 2024-02-01 07:00:10:存在多个低温温区,仍计1个有效时间点
- 有效时间点总数为2,总时长=2×5=10秒,符合预期。
内容的提问来源于stack exchange,提问作者Duane Pate
相关产品推荐
相关产品推荐

