mysql 的rank 函数,if函数的使用


=========================  例子 ========================================


 需求:获取分类平均值的名次? 比如10个班级的平均分,按照班级名称排序,后面跟着名次。


记录表:table_test ;


字段:banji 班级;AvgS 平均分;pm 排名;


解决方法:

SELECT
            M.*
FROM  
 (  
     SELECT A.*,@rank:=@rank+1 as pm  
     FROM     
     (    
      SELECT banji,avg(score) as AvgS FROM table_test GROUP BY banji  ORDER BY AvgS   DESC    
     ) A ,(SELECT @rank:=0) B   
 ) M  
 ORDER BY M.banji  
==============================>>>>>>>>输出结果:
banji  AvgS    pm
-----------------------

'1', '47.0000', '1'
'2', '12.0000', '3'
'5', '38.5000', '2'


例2 我们以 a 分组,查询 b列 最大的2个值。

1.创建表
Create Table: CREATE TABLE `sam` (
  `a` int(11) DEFAULT NULL,
  `b` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8

2.插入模拟数据
INSERT INTO `sam` VALUES (1,10),(1,15),(1,20),(1,25),(2,20),(2,22),(2,33),(2,45);
+------+------+
| a    | b    |
+------+------+
|    1 |   10 | 
|    1 |   15 | 
|    1 |   20 | 
|    1 |   25 | 
|    2 |   20 | 
|    2 |   22 | 
|    2 |   33 | 
|    2 |   45 | 
+------+------+

3.SQL实现  我们以a分组,查询b列最大的2个值。 这条sql要怎么写了?

select a, b, rownum, rank
from 
    (
    SELECT  
      ff.a,
      ff.b,
      @rownum:=@rownum+1 rownum,   --排序后的行号  
      if(@pa=ff.a,   --与上个a比较,相同继续+1排序,不同说明组别不一样,从1开始重新排
        @rank:=@rank+1,
        @rank:=1
      ) as rank,
      @pa:=ff.a 
    FROM
      (select a,b from sam group by a,b order by a asc,b desc) ff,
      (select @rank:=0,@rownum:=0,@pa=null) tt
  ) result 
HAVING  rank <=2;  --rank起到按a排序后标记顺序以及筛选的作用
4.结果:
+------+------+--------+------+
| a    | b    | rownum | rank |
+------+------+--------+------+
|    1 |   25 |      1 |    1 | 
|    1 |   20 |      2 |    2 | 
|    2 |   45 |      5 |    1 | 
|    2 |   33 |      6 |    2 | 
+------+------+--------+------+
4 rows in set (0.00 sec)

例3
下面不仅要对成绩进行排名,而且需要相同成绩的具有相同的排名。
表:score,有三个字段,id,name,score

select 
  tmp.id,tmp.name,tmp.score,
  @j:=@j+1 as j,    -- 顺序一直在变大
  @k:=(case when @pre_score=tmp.score then @k else @j end) as rank, -- 只有在前后二次排序值不同时才会使用顺序号
  @pre_score:=tmp.score as pre_score
from 
(select * from score order by score desc) tmp,(select @k :=0,@j:=0, @pre_score:=0) sdcore
  -- @k 表示最终的排名(相同值时序号相同) 
  -- @j 表示顺序排名 
  -- @pre_score上一次排序值

 

 

 

posted @ 2016-11-15 11:04  歲夢灬沉浮  阅读(785)  评论(0)    收藏  举报