在以下场景中:对于id = 2,运行日期从2015-01-30到2014-11-28从数据库记录开始,因为我正在搜索最近3个月的记录,然后尝试找出它们之间的区别x月 - 最新数据点值为11(2015-01-30值)-5(2014-11-28值)= id = 2。但是我想修改我的查询,使其从今天起1个月后开始并占用该月的第一个日期(即2015年1月1日:每月的第1个日期),即使数据库记录中的第一个数据点从2015年开始-01-30实际搜索应从2015年1月1日开始,其差异应为8 - 0 = 8而不是6。如何调整我的查询来执行此操作
目标是找到两个值之间的偏差:x个月后的值 - 最新值。因为数据表中没有可用的feb数据(表示临时表),因此最新值变为id 2 0和x月后值变为8(2014年12月的值)= 8-0 = 8
CREATE TABLE #t ( ID INT, V FLOAT, D DATE )
INSERT INTO #t
VALUES ( 1, 1.2, '2014-01-01' ),
( 1, 1.33, '2014-01-02' ),
( 1, 1.33, '2014-01-03' ),
( 2, 7, '2014-10-31' ),
( 2, 5, '2014-11-28' ),
( 2, 8, '2014-12-31' ),
( 2, 11, '2015-01-30' );
DECLARE @DealClauseString NVARCHAR(MAX)
SET @DealClauseString = ';WITH filter
AS ( SELECT ID ,
D ,
V ,
ROW_NUMBER() OVER ( PARTITION BY ID ORDER BY D DESC ) AS RN
FROM #t
),
cte
AS ( SELECT ID ,
D ,
V ,
MIN(D) OVER ( PARTITION BY ID ORDER BY D ROWS
BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING ) AS Min ,
MAX(D) OVER ( PARTITION BY ID ORDER BY D ROWS
BETWEEN UNBOUNDED PRECEDING AND
UNBOUNDED FOLLOWING ) AS Max
FROM filter
WHERE RN <= 2
)
SELECT c1.ID ,
c2.V - c1.V AS V
FROM cte c1
JOIN cte c2 ON c1.ID = c2.ID AND c1.D < c2.D
WHERE ( c1.D = c1.MIN OR c1.D = c1.MAX )
AND ( c2.D = c2.MIN OR c2.D = c2.MAX ) and c2.V - c1.V between 0.3 and 6 '
EXEC (@DealClauseString)
drop table #t
任何帮助都非常有帮助。如果您有任何疑问,请告诉我。