2016-04-11 74 views
2

我看不出什麼錯誤的位置:如何將值添加到以隨機值顯示排名的列?

DECLARE @cData TABLE(cID NVARCHAR(1), cSeed DECIMAL(8,8), cRank INT) 

INSERT INTO @cData (cID, cSeed) SELECT 'W', RAND() 
INSERT INTO @cData (cID, cSeed) SELECT 'X', RAND() 
INSERT INTO @cData (cID, cSeed) SELECT 'Y', RAND() 
INSERT INTO @cData (cID, cSeed) SELECT 'Z', RAND() 

SELECT cID, cSeed, (RANK() OVER (ORDER BY cSeed)) AS cRank FROM @cData 

UPDATE @cData 
    SET cRank = (SELECT (RANK() OVER (ORDER BY cSeed))) 

SELECT * FROM @cData 

爲什麼我會收到來自我的第一個SELECT語句不同的結果比我從我的第二個 - 爲什麼沒有我的update語句把同樣的數據放入我的第一個選擇語句顯示的表中?

enter image description here

回答

1
SELECT (RANK() OVER (ORDER BY cSeed)) 

這是對自己的聲明,僅在OVER/ORDER BY子句中使用的列相關。

它對一個記錄(來自@cData的當前記錄)的隱含行集合進行操作,因此總是返回1,因爲根據定義,集合中唯一記錄的排名爲1。

我相信你想,而不是運行此:

WITH t AS 
     (
     SELECT *, 
       RANK() OVER (ORDER BY cSeed) rnk 
     FROM @cData 
     ) 
UPDATE t 
SET  cRank = rnk 
+1

這是一個很好的例子,其中,作爲CTE目標的更新可以是一個很好的主意! – Shnugo

+0

輝煌。謝謝。 – DaveX