分组号码sql server

use*_*076 1 sql sql-server-2008

我有一张桌子

  ID |  Name  |  Rank
    1  Name1  
    2  Name2  
    1  Name3  
    2  Name4  
    3  Name5  
    1  Name6
    1  Name7
Run Code Online (Sandbox Code Playgroud)

我的结果应该是这样的:

  ID |  Name  |  Rank
    1  Name1     1
    2  Name2     1 
    1  Name3     2
    2  Name4     2 
    3  Name5     1 
    1  Name6     3
    1  Name7     4
Run Code Online (Sandbox Code Playgroud)

我发现了这个:排名(按名称排序),但它会对整个表进行排名.如何按ID分组?

更新:

我很抱歉.Michael Ames提供了完美正确的答案.但我需要与WHERE条件相同的东西.我误解了这个问题,我很抱歉.真正的问题是这样的:所以我需要按名称ID按名称分组客户端不是空订单的所有名称.我有这些表:

   ID |  Name  |  Client | Rank
        1  Name1  Client1
        2  Name2  NULL
        1  Name3  Client2
        2  Name4  Client3
        3  Name5  Client4
        1  Name6  NULL
        1  Name7  Client5
Run Code Online (Sandbox Code Playgroud)

我的结果应该是这样的:

      ID |  Name |  Client | Rank
        1  Name1  Client1     1
        2  Name2  NULL
        1  Name3  Client2     2
        2  Name4  Client3     1
        3  Name5  Client4     1
        1  Name6  NULL        
        1  Name7  Client5     3
Run Code Online (Sandbox Code Playgroud)

Mic*_*mes 5

十分简单:

以下示例按名称对每个名称进行排名:

SELECT ID, Name, Rank() OVER (PARTITION BY ID ORDER BY Name ASC) as Rank
FROM Names
ORDER BY Name ASC
Run Code Online (Sandbox Code Playgroud)

以下示例按名称对每个名称进行排名,但跳过客户端为空的记录:

SELECT ID, Name, Client, Rank() OVER (PARTITION BY ID ORDER BY Name ASC) as Rank
FROM Names 
WHERE Client IS NOT NULL
Run Code Online (Sandbox Code Playgroud)

最后,以下示例使用上一个示例的结果更新具有适当排名的表:

UPDATE Names 
SET Rank = ranks.rank
FROM
  (SELECT ID, Name, Client, Rank() OVER (PARTITION BY ID ORDER BY Name ASC) as Rank
  FROM Names 
  WHERE Client IS NOT NULL
  ) ranks
WHERE Names.Name = ranks.Name
Run Code Online (Sandbox Code Playgroud)

在最后一个示例中,如果Name不是唯一的,您很可能希望更改WHERE子句以匹配唯一标识符.

这里有一些相当容易理解的文档:http://msdn.microsoft.com/en-us/library/ms176102.aspx

祝好运!