0

我有从模板制作的对象。这些对象上有几个数据点,我测量每个零件上的每个数据点,以查看零件离模板有多远。我想进行最近的 100 次测量并找到它们的平均值和标准偏差。以下是我的表值的详细信息:

  • reqt_id:每个不同的reqt_id代表对象上的一个数据点
  • var:每个 var 是一个测量值。
  • inst_id:每个新的测量值(var)都有一个 inst_id,所以这用于找出哪些测量值是最新的

所以总而言之,如果我的零件有 5 个不同的数据点要测量,我将有 5 个不同的 reqt_id。如果我有 500 个要测量的零件,则每个 reqt_id 将有 500 个 var 测量值。我想要对我的 SQL 存储过程做的是编写一个游标,它将从某个 reqt_id 中获取最近的 100 个 var 测量值,然后获取它的 AVG 和 STDEV,然后移动到下一个。理想情况下,我的表格将如下所示:

..REQT_ID..|..AVG..|..STDDEV..

..0001........|..0.32..|..0.0012....

..0002........|..0.27..|..0.0005....

以下是我到目前为止的光标。到目前为止它不起作用,所以我想知道我到底错过了什么。

 DECLARE cursor_reqt_ids CURSOR FOR
 SELECT r.reqt_id, AVG(r.[var]), STDEV(r.[var])
 FROM RESULTS r

DECLARE @reqt_id AS INT

OPEN cursor_reqt_ids
 FETCH NEXT FROM cursor_reqt_ids INTO @reqt_id
 WHILE @@FETCH_STATUS = 0
 BEGIN
       SELECT TOP 100 r.[var]
       FROM RESULTS r
       WHERE r.[var] != 0
       ORDER BY r.inst_id DESC
 END
 CLOSE cursor_reqt_ids
DEALLOCATE cursor_reqt_ids
4

2 回答 2

1
 WHILE @@FETCH_STATUS = 0
 BEGIN
       SELECT TOP 100 r.[var]
       FROM RESULTS r
       WHERE r.[var] != 0 AND r.reqt_id = 4898
       ORDER BY r.inst_id DESC
FETCH NEXT FROM cursor_reqt_ids INTO @reqt_id --include this line so you can retrive next records and casuse the loop to terminate
 END

您的循环将进入无限循环,因为您没有在 while 循环中获取数据,因此您 @@FETCH_STATUS 永远不会变为 1 来终止循环。

于 2013-07-30T12:08:37.393 回答
0

试试这个,一种完全不同的没有光标的方法,应该可以在 sqlserver 2005+ 中使用:

;WITH a as
(
SELECT distinct reqt_id 
FROM RESULT
)
SELECT a.reqt_id, AVG(b.[var]) AVG, STDEV(b.[var]) var
FROM a
cross apply
(
SELECT top 100 r.[var] 
FROM RESULTS r
WHERE r.[var] != 0
AND a.reqt_id = r.reqt_id
ORDER BY r.inst_id DESC
) b
GROUP BY a.reqt_id
于 2013-07-30T12:21:14.010 回答