0

我有一个 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}
4

2 回答 2

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';
于 2012-10-10T15:07:22.107 回答
3
select 'alert'
where not exists (
    select 1 
    from MyTable
    where dtime > dateadd(day, -1, getdate())
        and cast(temperature as int) <= 80
)
于 2012-10-10T15:04:04.643 回答