我有一个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}
答案 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
)