SQL过程获取行号以确定"排名"

Ren*_*ndy 0 sql sql-server stored-procedures

我有一个表格,其中包含一个名为"得分"的列.我想编写一个循环遍历此表中所有行的过程,并确定所有行的位置,每个特定的行排名,即最大分数是等级1,最小分数= n.

到目前为止,这是我的不良尝试:

BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    DECLARE @Rank INT = 0;
    DECLARE @UserID UNIQUEIDENTIFIER;


    DECLARE cur CURSOR FOR SELECT UserID FROM tblMember
    OPEN cur

    FETCH NEXT FROM cur INTO @UserID
    --loop through all users
    WHILE @@FETCH_STATUS = 0 BEGIN

    SELECT @Rank = ROW_NUMBER() OVER(ORDER BY Score DESC) FROM tblDetails WHERE UserID = @UserID;
    PRINT @Rank 
    Print ' For '
    Print @UserID;

    UPDATE tblDetails SET Rank = @Rank WHERE UserID = @UserID; 

    FETCH NEXT FROM cur INTO @UserID
    END
END
Run Code Online (Sandbox Code Playgroud)

不幸的是,这种努力将每个条目排在1 - 可能是因为查询具有WHERE子句来细化结果集.但我无法确定正确的查询应该是什么!

Qua*_*noi 6

WITH    q AS
        (
        SELECT  *,
                ROW_NUMBER() OVER (PARTITION BY userId ORDER BY score DESC) rn
        FROM    tblDetail
        )
UPDATE  q
SET     rank = rn
Run Code Online (Sandbox Code Playgroud)