统计排行社区应用银行社区服务会员列表最新帖子精华区搜索帮助
主题 : 简单的SQL并列排名,为何这么多人做错?
admin离线
级别: 管理员
显示用户信息 
0 发表于: 02-03  

简单的SQL并列排名,为何这么多人做错?

http://topic.csdn.net/u/20090920/15/eff2a6e7-5151-40c8-bf6e-2794570df10d.html?60546

SQL code
--1、2楼已经是正解? 正解个屁,你多插入一行( 5 5 88 )试试!
--按成绩排名
id  name grade
  1   2     80
  2   2     90
  3   3     80
  4   4     88
  5   5     88

--是不是结果应该是:
id  name grade   rank
  1   2     80    3
  2   2     90    1
  3   3     80    3
  4   4     88    2
  5   5     88    2

--可是你去运行1、2楼的SQL语句看看,看看是不是上面这个结果!
select id,name,grade,(select count(*) from yourTable where grade>a.grade)+1 as rank
from yourTable
order by grade desc;

--------My SQL方法一:(Distinct子查询法)--------------------
--优点:不用去定义变量,省事
--缺点:运行效率不如方法二
select id, name, grade, (SELECT count(distinct grade) from tb1 where grade>t1.grade)+1 as rank
from tb1 t1
order by grade desc;

--------My SQL方法二:(变量递增法)--------------------------
--优点:速度应该比方法一快
--缺点:在每次运行此查询之前,要定义并初始化为0的变量,用以排名,比较麻烦!
set @rownum=0;

select t1.id, t1.name, t1.grade, t2.rank
from tb1 t1 right join (select distinct @rownum:=@rownum+1 as rank, grade from tb1 order by grade desc) t2
on t1.grade=t2.grade
order by t1.id;



--------Oracle方法一:(rownum右联接法)----------------------
select t1.id, t1.name, t1.grade, t2.rank
from tb1 t1 left join ( select rownum as rank, grade from  (select distinct grade from tb1 order by grade desc)) t2
on t1.grade=t2.grade
order by t1.id
描述
快速回复

按"Ctrl+Enter"直接提交
上一个下一个