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