MS SQL如何计算有序列表中的号码结果值的

问题描述:

想象我有这样的一个表:MS SQL如何计算有序列表中的号码结果值的

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那么查询不应该检测到事件。

有没有可能做到这一点,而无需使用存储过程?

+0

是的。有可能的。请在这里分享你的存储过程的代码;) – Raj

+0

Raj,感谢你的反馈和编辑:-)。我没有存储过程,并希望在编写查询时获得一些帮助。 –

+0

你的意思是*两个结果值*? – Rahul

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与上一行(在同一分区中)

LAG函数自SQL Server 2012起可用

+0

非常感谢。非常感谢您的帮助 –

不知道你的两个相继值的意思,但如果你正在寻找低于2.0 2个值,那么你可以做一个group byhaving

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

Rahul,谢谢你的评论。通过随后的价值观,我的意思是时间上的结果。因此,如果我们制作一个时间有序的列表,如2.2,1.9,1.8,则查询应检测到该事件。但是,如果列表像1.9,2.2,1.8那么查询不应该检测到事件。您提供的示例不会区分这两种情况 –