用SQL计算名次

博客记录了在优快云回答的关于SQL怎样取得指定人名次的问题。介绍了两种情况,一是名次按mypass排列,依次递增,mypass值相同时名次并列,需用临时表生成排序;二是名次依mypass排列,mypass值相同名次并列但计算排名,无需临时表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   几天前在优快云回答别人的问题: SQL怎样取得指定人的名次 ,现将结果招录下来。
一、测试数据:
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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值