2013-07-30 32 views
0

我有一個模板製作的對象。這些物體上有幾個數據點,我測量每個零件上的每個數據點以查看零件在模板上的距離。我想採取最近的100次測量並找到它們的平均值和標準偏差。下面是具體關於我的表中的值:光標檢索數據集以拍攝AVG和STDEV

  • reqt_id:每個不同reqt_id表示物體上的數據點
  • 變種:每個變種是一個測量。
  • INST_ID:每一個新的測量(VAR)得到一個INST_ID,所以這是用來找出測量是最近

因此,在總結,如果我的部分有5個不同的數據點,即時通訊測量,我將有5個不同的reqt_ids。如果我有500個Im測量部分,則每個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 

回答

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至終止循環。

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