美好的一天,
我有一个带有以下设置的SQL表:
DataPoints{ DateTime timeStampUtc , bit value}
这些点是一分钟的间隔,并存储1(开)或0(关)。
我需要编写一个存储过程来查找所有数据点的兴趣点。
我只需找到角点。请注意,值更改之间可能存在许多数据点。例如:
{0,0,0,0,0,0,0,1,1,1,1,0,0,0}
这是我的想法atm(高级别)
Select timeStampUtc, Value
From Data Points
Where Value before or value after differs by 1 or -1
我正在努力将这个概念转换为sql,我也感觉有一个更优雅的数学解决方案,我不知道。这一定是电子产品中的常见问题吗?
答案 0 :(得分:2)
我已将桌子包裹在CTE中。然后,我将CTE中的每一行连接到下一行。另外,我添加了一个条件,即后续行的值应该不同。
这将返回值更改的所有行。
;WITH CTE AS(
SELECT ROW_NUMBER() OVER(ORDER BY TimeStampUTC) AS id, VALUE, TIMESTAMPUTC
FROM DataPoints
)
SELECT CTE.TimeStampUTC as "Time when the value changes", CTE.id, *
FROM CTE
INNER JOIN CTE as CTE2
ON CTE.id = CTE2.id + 1
AND CTE.Value != CTE2.Value
这是一个工作小提琴:http://sqlfiddle.com/#!6/a0ddc/3
答案 1 :(得分:1)
如果我弄错了,你正在寻找这样的东西:
with cte as (
select * from (values (1,0),(2,0),(3,1),(4,1),(5,0),(6,1),(7,0),(8,0),(9,1)) t(a,b)
)
select
min(a), b
from (
select
a, b, sum(c) over (order by a rows unbounded preceding) grp
from (
select
*, iif(b = lag(b) over (order by a), 0, 1) c
from
cte
) t
) t
group by b, grp