我有一张像
这样的表格 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
答案 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
祝你好运!