将值与数据集中的前n个值进行比较

时间:2019-02-14 15:26:37

标签: sql sql-server subquery aggregate

我想将数据集中的值与该数据点之前记录的n个值的平均值进行比较。 我正在使用SQL Server。

到目前为止,我已经有了这段代码。 但这给出了最近3点的平均值(即使它们在该记录之后),而不是该参数在该记录之前的3点

SELECT DISTINCT data.batch, data.parameter, data.recorddate, data.value, 
   ( SELECT Avg(Val) 
FROM (SELECT TOP 3 data.value as Val FROM dbo.data data
ORDER BY data.recorddate DESC ) t ) as AvVal 
FROM  dbo.data data
ORDER BY data.parameter

所需的输出:

Batch Parameter RecordDate  Value   AvVal       Difference
A           X   20/02/2018  10.02       
B           X   21/02/2018  9.98        
D           X   22/02/2018  9.98        
C           X   23/02/2018  10.02   9.993333333 0.026666667
F           X   24/02/2018  10.01   9.993333333 0.016666667
E           X   25/02/2018  10.02   10.00333333 0.016666667
G           X   26/02/2018  10.02   10.01666667 0.003333333
H           X   27/02/2018  10.02   10.01666667 0.003333333
J           X   28/02/2018  10.01   10.02       -0.01
I           X   01/03/2018  10.01   10.01666667 -0.006666667
K           X   02/03/2018  10.01   10.01333333 -0.003333333
K           X   03/03/2018  10.01   10.01       0
L           X   04/03/2018  10      10.01       -0.01
M           X   05/03/2018  10      10.00666667 -0.006666667
N           X   06/03/2018  10      10.00333333 -0.003333333
D           Y   22/02/2018  6.31        
B           Y   22/02/2018  6.31        
A           Y   23/02/2018  6.25        
A           Y   24/02/2018  6.25    6.29            -0.04
D           Z   21/02/2018  220.3       

任何帮助,不胜感激!

1 个答案:

答案 0 :(得分:0)

您将使用窗口功能:

SELECT d.batch, d.parameter, d.recorddate, d.value,
       AVG(Val) OVER (PARTITION BY parameter ORDER BY d.recorddate ROWS BETWEEN 3 PRECEDING AND 1 PRECEDING),
       (val - AVG(Val) OVER (PARTITION BY parameter ORDER BY d.recorddate ROWS BETWEEN 3 PRECEDING AND 1 PRECEDING)) as diff
FROM  dbo.data data d
ORDER BY data.parameter;

注意:即使没有足够的记录,这也会计算平均值。如果您不喜欢该主意,则可以使用case表达式将计算范围限制为至少包含前3行的行。