使用sql查找方波的兴趣点

时间:2018-01-19 12:08:47

标签: sql-server algorithm mathematical-optimization

美好的一天,

我有一个带有以下设置的SQL表:

DataPoints{ DateTime timeStampUtc , bit value}

这些点是一分钟的间隔,并存储1(开)或0(关)。

我需要编写一个存储过程来查找所有数据点的兴趣点。

我在下面有一张简化图: enter image description here

我只需找到角点。请注意,值更改之间可能存在许多数据点。例如:

{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,我也感觉有一个更优雅的数学解决方案,我不知道。这一定是电子产品中的常见问题吗?

2 个答案:

答案 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