我想根据值和日期时间在数据集中找到水平直线模式
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
输出结果
我想知道一个值是否在这个序列中的所有值都几乎相等的序列中。 例如,如果阈值为“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
输出结果