sql选择行,如果另一个不存在

时间:2017-08-21 16:06:55

标签: sql sql-server-2012

我有一个包含大约一百万个条目的表,如下所示:

TimeStamp                   TagName     Alarm Status
2017-08-02 10:53:10.000     XS-101      Alarm
2017-08-02 18:49:45.000     XS-201      Alarm
2017-08-03 01:08:16.000     XS-101      Normal
2017-08-05 09:16:42.000     XS-301      Alarm
2017-08-12 12:33:39.000     XS-101      Alarm

我需要弄清楚哪个TagName报警时间最长,但我不在乎它是否目前没有报警。我可以使用我的程序代码执行此操作,但我的所有程序的其他SQL查询都返回了我需要的内容。是否可以仅使用SQL执行此操作?

我已经搜索了人们根据其他行的内容返回行的示例,但我没有运气。

1 个答案:

答案 0 :(得分:1)

哪个标签处于警报状态,最长的是询问哪个标签具有最早的当前警报代码。

您可以使用条件聚合执行此操作:

select tagname, max(timestamp)
from t
group by tagname
having max(timestamp) = max(case when status = 'Alarm' then timestamp end)
order by max(timestamp) asc;

这假设同一个标签没有两个报警顺序 - 这与您描述的数据一致。