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

Detecting Data Transitions in SQL Data using View and Lag()

我正在尝试创建一个视图,其中列出了 table 数据在 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

这为我提供了一个 table 当每一行都在边界之外时:

| id | data1 |
|----|-------|
|  2 |    60 |
|  3 |    60 |
|  5 |    60 |
|  6 |    60 |
|  7 |   300 |

我真正想要的是一个只列出转换的视图,即:

| 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 子句中包含 or prevvalue is null