You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于PLC温度数据统计任意温区低温时长的变量累加方法

问题描述

我有一张从PLC读取数据的EVENT_DATA表,包含n个温区标签('TempZone1','TempZone2','TempZone3'等),每5秒更新一次各温区的温度数据,数据结构如下:

DateTimeTagNameDataValue
2024-02-01 07:00:05TempZone1371
2024-02-01 07:00:05TempZone2379
2024-02-01 07:00:05TempZone3368
2024-02-01 07:00:10TempZone1369
2024-02-01 07:00:10TempZone2380
2024-02-01 07:00:10TempZone3367

需求是统计任意一个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 18:57:37