如何将值添加到按随机值显示排名的列?

时间:2016-04-11 15:48:44

标签: tsql

我无法看到这里出了什么问题:

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语句得到的结果与我从第二个语句得到的结果不同 - 为什么我的更新语句没有将相同的数据放入我的第一个select语句显示的表中?

enter image description here

1 个答案:

答案 0 :(得分: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