http://topic.csdn.net/u/20090920/15/eff2a6e7-5151-40c8-bf6e-2794570df10d.html?60546
--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

解决方案 »

  1.   

    这个问题其实不是SQL语句的问题,而是对“排名”理解的问题。 关键要看客户的要求是什么。大部分情况下,如果有两个并列第一,就没有第二名了。 这样 你的例子80的则会变成并列第四。
    id  name grade   rank
      1   2     80    4
      2   2     90    1
      3   3     80    4
      4   4     88    2
      5   5     88    2当然如果客户有要求是按不同的分数排名,这个以前也有人问过,是用count(distinct 来实现, 和你的一样。
    所以说, 有时候用例子来说明自己的要求也是一门技巧。你的这个例子则比较清楚,但你所说的那个贴子的提问者具体要哪种则无法预料了。或者是按大部分人的思维按常规方法排名。或者是按你这种排法。
      

  2.   

    主要是相同分数如何排名的问题:
    select a1.*,b1.pm1 from pm a1 left join (
    select a.grade,count(b.grade) as pm1 from (
    SELECT grade from pm group by grade) a
    left join
    (
    SELECT grade from pm group by grade) b
    on a.grade<=b.grade group by a.grade) b1 on a1.grade=b1.grade
      

  3.   

    一条好的sql语句是什么都要考虑到的 
    比如值为不为空
    有没有null值
    索引的使用情况
    与IO的交互等等 考虑全部的话一条sql语句不是那么容易就写出来的 大家都是建议 你只参考 最终还要你修改与测试的
      

  4.   


    http://topic.csdn.net/u/20090920/15/eff2a6e7-5151-40c8-bf6e-2794570df10d.html?60546原贴是 xxm712  的一个提问,不是楼主的 xxm712  的确没有对这个排名的问题说清楚,所以大家一般都会按照个人的理解和惯例来猜测原题。当然很多少,或者说大部分人会主为,并列第一后,就没有第二名了。其实不存在对与不对,只不过是每个人根据自己的经验,环境所做的猜测。luoyoumou1202  的解法同样也是依据并列第一后,第三个人是第二这种猜测,算法上同样也没有问题。
    但个人不赞成,以偏盖全,一种算法的正确,并不代码另一种算法是不对的,关键是大家都是基于猜测。没什么对与不对。关于这个猜测的解释其实已经在另一个贴子中提示了一下,估计 luoyoumou1202 没有看到或者忽略了。http://topic.csdn.net/u/20090921/12/4a6b66dd-c4f3-48ac-98e8-9cb21b0ea626.html[Quote = #17楼] 引用排序结果为:
    name  grade No
    a   80  2  
    b   90  1
    c   70  3
    d   70  3
    e   80  2
    f   80  2
    d   90  1
    g   90  1这个问题比较常见。关键是用户如何定义这个“排名”的问题。 比如对 80 的前面有两个并列第一的,这个80的是第二,还是第三,要看业务逻辑而定了。 如果80为第二,则可以用 COUNT(DISTINCT) , 但这种排名方式相对比较少见。[/Quote]
    有不同见解欢迎讨论,但请注意言辞。