分组号码sql server

时间:2011-07-18 21:11:51

标签: sql sql-server-2008

我有一张像

这样的表格
  ID |  Name  |  Rank
    1  Name1  
    2  Name2  
    1  Name3  
    2  Name4  
    3  Name5  
    1  Name6
    1  Name7

我的结果应该是这样的:

  ID |  Name  |  Rank
    1  Name1     1
    2  Name2     1 
    1  Name3     2
    2  Name4     2 
    3  Name5     1 
    1  Name6     3
    1  Name7     4

我发现了这个:排名(按名称排序),但它会对整个表进行排名。如何按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

我的结果应该是这样的:

      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

1 个答案:

答案 0 :(得分:5)

容易腻:

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

SELECT ID, Name, Rank() OVER (PARTITION BY ID ORDER BY Name ASC) as Rank
FROM Names
ORDER BY Name ASC

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

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

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

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

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

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

祝你好运!