几天前在优快云回答别人的问题: SQL怎样取得指定人的名次 ,现将结果招录下来。
一、测试数据:
二、名次按mypass排列,依次递增,mypass值相同时名次并列,即要求结果为:
需要使用临时表生成排序,使用以下语句:
三、名次依mypass排列,mypass值相同名次并列,但计算排名,即:
这个稍为简单,无需临时表:
一、测试数据:
| select A.* into #tmp_Mark from ( select id=1, myname='小明', mypass=123 union select id=2, myname='小花', mypass=122 union select id=3, myname='小东', mypass=111 union select id=4, myname='小牛', mypass=122 ) A |
二、名次按mypass排列,依次递增,mypass值相同时名次并列,即要求结果为:
| id | myname | mypass | OrderNo |
| 1 | 小明 | 123 | 1 |
| 2 | 小花 | 122 | 2 |
| 3 | 小牛 | 122 | 2 |
| 4 | 小东 | 111 | 3 |
需要使用临时表生成排序,使用以下语句:
| select IDENTITY(int, 1,1) as OrderNo, mypass into #tmp_Order from #tmp_Mark group by mypass order by mypass desc --显示结果 select B.*, A.OrderNo from #tmp_Order A,#tmp_Mark B where A.mypass=B.mypass order by A.OrderNo --如果只要单独知道小花排序 select OrderNo from #tmp_Order A, #tmp_Mark B where A.mypass=B.mypass and B.myname='小花' |
三、名次依mypass排列,mypass值相同名次并列,但计算排名,即:
| id | mynam | mypass | OrderNo |
| 1 | 小明 | 123 | 1 |
| 2 | 小花 | 122 | 2 |
| 3 | 小牛 | 122 | 2 |
| 4 | 小东 | 111 | 4 |
这个稍为简单,无需临时表:
| select A.*,myOrder=(select count(*) from #tmp_Mark where mypass>a.mypass)+1 from #tmp_Mark A order by myOrder |
博客记录了在优快云回答的关于SQL怎样取得指定人名次的问题。介绍了两种情况,一是名次按mypass排列,依次递增,mypass值相同时名次并列,需用临时表生成排序;二是名次依mypass排列,mypass值相同名次并列但计算排名,无需临时表。
2257

被折叠的 条评论
为什么被折叠?



