我想根据值和日期时间在数据集中找到水平直线模式

I want to find Horizontal Straight Line pattern in dataset based on value and DateTime

我想知道一个值是否在这个序列中的所有值都几乎相等的序列中。 例如,如果阈值为“0.02”,如果值与先前值之间的差异小于“0.02”,则此值几乎相等 我的数据集是这样的:

create table #temp(rn int,snap_DateTime datetime,value real)
insert into #temp(rn ,snap_DateTime ,value ) values(1,'Nov  9 2014 12:00AM',11.9018)
insert into #temp(rn ,snap_DateTime ,value ) values(2,'Nov  9 2014 12:09AM',13.2106)
insert into #temp(rn ,snap_DateTime ,value ) values(3,'Nov  9 2014 12:18AM',13.5882)
insert into #temp(rn ,snap_DateTime ,value ) values(4,'Nov  9 2014 12:27AM',12.587)
insert into #temp(rn ,snap_DateTime ,value ) values(5,'Nov  9 2014 12:36AM',14.6033)
insert into #temp(rn ,snap_DateTime ,value ) values(6,'Nov  9 2014 12:45AM',14.834)
insert into #temp(rn ,snap_DateTime ,value ) values(7,'Nov  9 2014 12:54AM',14.7367)
insert into #temp(rn ,snap_DateTime ,value ) values(8,'Nov  9 2014  1:03AM',14.3165)
insert into #temp(rn ,snap_DateTime ,value ) values(9,'Nov  9 2014  1:12AM',15.8682)
insert into #temp(rn ,snap_DateTime ,value ) values(10,'Nov  9 2014  1:21AM',11.4258)
insert into #temp(rn ,snap_DateTime ,value ) values(11,'Nov  9 2014  1:30AM',11.7084)
insert into #temp(rn ,snap_DateTime ,value ) values(12,'Nov  9 2014  1:39AM',10.7714)
insert into #temp(rn ,snap_DateTime ,value ) values(13,'Nov  9 2014  1:48AM',8.40939)
insert into #temp(rn ,snap_DateTime ,value ) values(14,'Nov  9 2014  1:57AM',8.98969)
insert into #temp(rn ,snap_DateTime ,value ) values(15,'Nov  9 2014  2:06AM',16.8318)
insert into #temp(rn ,snap_DateTime ,value ) values(16,'Nov  9 2014  2:15AM',18.9059)
insert into #temp(rn ,snap_DateTime ,value ) values(17,'Nov  9 2014  2:24AM',18.8377)
insert into #temp(rn ,snap_DateTime ,value ) values(18,'Nov  9 2014  2:33AM',18.1958)
insert into #temp(rn ,snap_DateTime ,value ) values(19,'Nov  9 2014  2:42AM',16.7439)
insert into #temp(rn ,snap_DateTime ,value ) values(20,'Nov  9 2014  2:51AM',15.2362)
insert into #temp(rn ,snap_DateTime ,value ) values(21,'Nov  9 2014  3:00AM',16.8727)
insert into #temp(rn ,snap_DateTime ,value ) values(22,'Nov  9 2014  3:09AM',16.416)
insert into #temp(rn ,snap_DateTime ,value ) values(23,'Nov  9 2014  3:18AM',16.3363)
insert into #temp(rn ,snap_DateTime ,value ) values(24,'Nov  9 2014  3:28AM',16.0932)
insert into #temp(rn ,snap_DateTime ,value ) values(25,'Nov  9 2014  3:37AM',16.9407)
insert into #temp(rn ,snap_DateTime ,value ) values(26,'Nov  9 2014  3:46AM',17.0356)
insert into #temp(rn ,snap_DateTime ,value ) values(27,'Nov  9 2014  3:55AM',15.9732)

如果我没理解错就用这个

DECLARE @temp AS TABLE
    (
      rn INT ,
      snap_DateTime DATETIME ,
      value REAL
    )
INSERT  INTO @temp
        ( rn, snap_DateTime, value )
VALUES  ( 1, 'Nov  9 2014 12:00AM', 11.9018 ),
        ( 2, 'Nov  9 2014 12:09AM', 13.2106 ),
        ( 3, 'Nov  9 2014 12:18AM', 13.5882 ),
        ( 4, 'Nov  9 2014 12:27AM', 13.5882 ),
        ( 5, 'Nov  9 2014 12:36AM', 14.6033 ),
        ( 6, 'Nov  9 2014 12:45AM', 14.834 ),
        ( 7, 'Nov  9 2014 12:54AM', 14.7367 ),
        ( 8, 'Nov  9 2014  1:03AM', 14.3165 ),
        ( 9, 'Nov  9 2014  1:12AM', 15.8682 ),
        ( 10, 'Nov  9 2014  1:21AM', 11.4258 ),
        ( 11, 'Nov  9 2014  1:30AM', 11.7084 ),
        ( 12, 'Nov  9 2014  1:39AM', 10.7714 ),
        ( 13, 'Nov  9 2014  1:48AM', 8.40939 ),
        ( 14, 'Nov  9 2014  1:57AM', 8.98969 ),
        ( 15, 'Nov  9 2014  2:06AM', 16.8318 ),
        ( 16, 'Nov  9 2014  2:15AM', 18.9059 ),
        ( 17, 'Nov  9 2014  2:24AM', 18.8377 ),
        ( 18, 'Nov  9 2014  2:33AM', 18.1958 ),
        ( 19, 'Nov  9 2014  2:42AM', 16.7439 ),
        ( 20, 'Nov  9 2014  2:51AM', 15.2362 ),
        ( 21, 'Nov  9 2014  3:00AM', 16.8727 ),
        ( 22, 'Nov  9 2014  3:09AM', 16.416 ),
        ( 23, 'Nov  9 2014  3:18AM', 16.3363 ),
        ( 24, 'Nov  9 2014  3:28AM', 16.0932 ),
        ( 25, 'Nov  9 2014  3:37AM', 16.9407 ),
        ( 26, 'Nov  9 2014  3:46AM', 17.0356 ),
        ( 27, 'Nov  9 2014  3:55AM', 15.9732 )

-- first vatiant (2012 and earliest)
SELECT  T.rn ,
        T.snap_DateTime ,
        T.value ,
        CASE WHEN ABS(T.Value - COALESCE(lead(T.VALUE) OVER ( ORDER BY rn ), 0)) < 0.02
                  OR ABS(T.Value - COALESCE(lag(T.VALUE) OVER ( ORDER BY rn ),
                                            0)) < 0.02 THEN 'Y'
             ELSE 'N'
        END
FROM    @temp AS T

--second variant (for older than 2012 version)

SELECT  A.rn ,
        A.snap_DateTime ,
        A.value ,
        CASE WHEN ABS(A.value - COALESCE(B.value, 0)) < 0.02
                  OR ABS(A.value - COALESCE(C.value, 0)) < 0.02 THEN 'Y'
             ELSE 'N'
        END
FROM    @temp AS A
        LEFT JOIN @temp AS B ON ( A.RN + 1 ) = B.RN
        LEFT JOIN @temp AS C ON ( A.RN - 1 ) = C.RN 

输出结果