MS SQL如何计算有序列表中的许多后续值

时间:2017-04-27 10:22:12

标签: sql sql-server

想象一下,我有一张这样的表:

DatasourceID | Value | TimeStamp |
123          | 2.5   | 09:23:35  |
54           | 2.0   | 08:03:41  |
123          | 1.9   | 09:25:36  |
54           | 2.0   | 08:03:41  |
123          | 1.9   | 09:21:35  |
54           | 2.0   | 08:03:41  |

我需要找出每个数据源是否有两个低于2.0的结果值,使用时间戳作为排序参数。

由此产生的价值我的意思是随之而来的。因此,如果我们制作一个时间有序的值列表,如2.2,1.9,1.8,那么查询将检测该事件。但是,如果列表如1.9,2.2,1.8那么查询将不会检测到该事件。

可以在不使用存储过程的情况下完成吗?

2 个答案:

答案 0 :(得分:0)

不确定两个后续值的含义,但如果您要查找低于2.0的2个值,则可以使用group by having进行{/ 1}}

select DatasourceID 
from tbl1
where Value < 2.0
group by DatasourceID 
having count(distinct value) = 2 

答案 1 :(得分:0)

select DatasourceID, Timestamp
from (
    select DatasourceID,
      Timestamp,
      Value,
      lag(Value, 1, 5.0) over (partition by DatasourceID order by TimeStamp) as Previous
    from the_table
) s1
where Value < 2.0 and Previous < 2.0

想法是按DatasourceID拆分,按TimeStamp对每个分区进行排序,并将每行的Value与前一行(在同一分区中)进行比较

自SQL Server 2012以来LAG功能可用