我想将数据集中的值与该数据点之前记录的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
任何帮助,不胜感激!
答案 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行的行。