T-SQL:检查温度超过24小时

时间:2012-10-10 14:59:48

标签: sql tsql

我有一个SQL Server数据库,其中包含两个我感兴趣的值:

dtime - datetime
temperature - varchar

该表由外部过程供给,该过程每30分钟获取一次建筑物的温度。如果温度超过80度持续48个周期(24小时),我有兴趣触发警报。

我认为这需要是一个外部进程,它会扫描表并在满足此条件时发送警报。我正在努力编写SQL来做这件事。

修改

我每周都会收到数据。在这个星期,我需要看看在24小时内的任何时间温度是否超过80度。空调可能会在任何时间失败并且持续两天或更长时间,所以我需要在多天内检查这个。温度每半小时一次,所以在这一周我需要检查是否有48个以上温度超过80度的情况。

示例数据:

10/1/2012 12:00:00 AM | 70 | {ok}
10/1/2012 12:30:00 AM | 70 | {ok}
10/1/2012 1:00:00 AM | 70 | {ok}
10/1/2012 1:30:00 AM | 75 | {ok}
10/1/2012 2:00:00 AM | 75 | {ok}
10/1/2012 2:30:00 AM | 80 | {ok}

2 个答案:

答案 0 :(得分:4)

您可以使用ALL

IF 80 < ALL(
  SELECT temperature 
  FROM (
    SELECT temperature, dtime,
    RN = ROW_NUMBER() OVER (ORDER BY dtime DESC)
    FROM dbo.Temps 
  ) X
  WHERE RN <= 48
)
SELECT 'ALERT, the last 48 measurements exceeded 80 degrees!'
ELSE 
SELECT 'everything is okay';

小提琴:http://sqlfiddle.com/#!6/4e2c8/7/0

编辑:正如Blam所说,使用TOP

可以简化这一点
IF 80 < ALL(
   SELECT TOP 48 temperature 
   FROM dbo.Temps
   ORDER BY dtime DESC
)
SELECT 'ALERT, the last 48 measurements exceeded 80 degrees!'
ELSE 
SELECT 'everything is okay';

答案 1 :(得分:3)

select 'alert'
where not exists (
    select 1 
    from MyTable
    where dtime > dateadd(day, -1, getdate())
        and cast(temperature as int) <= 80
)