使用View和Lag()检测SQL数据中的数据转换

使用View和Lag()检测SQL数据中的数据转换,sql,sql-server,sql-view,Sql,Sql Server,Sql View,我试图创建一个视图,当一个数据表在一些由where条件指定的边界之间切换时,该视图列出了转换,例如 | id | data1 | data1high | data1low | |----|-------|-----------|----------| | 1 | 150 | 200 | 100 | | 2 | 60 | 200 | 100 | | 3 | 60 | 200 | 100 | |

我试图创建一个视图,当一个数据表在一些由where条件指定的边界之间切换时,该视图列出了转换,例如

| id | data1 | data1high | data1low | 
|----|-------|-----------|----------|
|  1 |   150 |       200 |      100 |      
|  2 |    60 |       200 |      100 | 
|  3 |    60 |       200 |      100 |
|  4 |   150 |       200 |      100 | 
|  5 |    60 |       200 |      100 |
|  6 |    60 |       200 |      100 |
|  7 |   300 |       200 |      100 |
我的观点是:

create view alarming_data as
   select id, data1
   from SensorData as A
   where A.data1 < A.data1low OR A.data1 > A.data1high
我真正想要的是一个只列出过渡的视图,即:

| id | data1 | data1high | data1low | 
|----|-------|-----------|----------|
|  1 |   150 |       200 |      100 |      
|  2 |    60 |       200 |      100 | 
|  4 |   150 |       200 |      100 | 
|  6 |    60 |       200 |      100 |
|  7 |   300 |       200 |      100 |
我曾考虑过使用lag函数来比较前一行和下一行,并尝试应用转换检测逻辑,但我没有成功地应用lag,然后开始怀疑这是否是正确的方法:

create view detect_trans as
   select lag(data1,1) over (orderby id) as previousdata,
   from SensorData as A
   where ((A.data1 < A.data1low OR A.data1 > A.data1high) AND ((previousdata.data1 < previousdata.data1low OR previousdata.data1 > previousdata.data1high))
关于如何实现detect_trans视图,您有什么想法或建议吗

编辑:

正在处理Gordons的解决方案,但同时尝试集成条件测试:

create view trans_data as
select id, data1, data1high, data1low
from (select sd.*, lag(data1) over (order by id) as prevvalue
     from SensorData sd
    ) sd
where (sd.data1 < sd.data1low OR sd.data1 > sd.data1high) <> prevvalue;
将lag与子查询一起使用:

create view alarming_data as
   select id, data1, data1high, data1.low
   from (select sd.*, lag(data1) over (order by id) as prevvalue
         from SensorData sd
        ) sd
   where data1 <> prevvalue;

如果需要第一个值,则where子句中的include或prevvalue为null。

@user3238504。sd是一个表别名。SQL Server和许多其他数据库中的子查询都需要它。在进行自连接时也需要它。我刚刚意识到它实际上不是完整的解决方案,因为它没有考虑where中的条件元素。当一个值与下一个值不同(即60到62)时,建议的解决方案有效,但我想知道变化何时发生在某些条件限制之外。我已经更新了我的代码,但是我在@user3238504附近发现了一个语法错误。试着问另一个问题,用条件结果更详细地解释这个问题。
create view alarming_data as
   select id, data1, data1high, data1.low
   from (select sd.*, lag(data1) over (order by id) as prevvalue
         from SensorData sd
        ) sd
   where data1 <> prevvalue;