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)
十分简单:
以下示例按名称对每个名称进行排名:
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
祝好运!
| 归档时间: |
|
| 查看次数: |
170 次 |
| 最近记录: |