当前位置:Gxlcms > 数据库问题 > SQL-Rank-Example

SQL-Rank-Example

时间:2021-07-01 10:21:17 帮助过:5人阅读

数据全部使用 MySQL-Employee-Database

Rank排名(不分组)

计算薪资范围在[39200,39220]的薪资排名(数据量比较小,且包含重复值)

普通排名,不考虑值重复

使用一个@rank变量来递增排名值

  1. <code class="language-sql">select s.salary, @rank:=@rank+1 as rk
  2. from salaries s,(select @rank:=0) r
  3. where
  4. s.salary between 39200 and 39220
  5. order by s.salary desc ;
  6. </code>
  1. <code>salary
  2. rk
  3. 39217
  4. 1
  5. 39217
  6. 2
  7. 39216
  8. 3
  9. 39215
  10. 4
  11. 39212
  12. 5
  13. 39206
  14. 6
  15. 39205
  16. 7
  17. 39202
  18. 8
  19. 39202
  20. 9
  21. 39201
  22. 10
  23. 39200
  24. 11
  25. </code>

并列排名,相同值排名相同

使用一个@rank变量来递增排名值,如果和上一条记录的薪资相等,则排名不变

  1. <code class="language-sql">select s.salary,
  2. case
  3. when @last_s = s.salary then @rank
  4. when @last_s:=s.salary then @rank:=@rank+1
  5. end as rk
  6. from salaries s,(select @rank:=0,@last_s:=0) t
  7. where
  8. s.salary between 39200 and 39220
  9. order by s.salary desc ;
  10. #-------------------------------
  11. #另一种IF的写法
  12. select salary,rk from
  13. (
  14. select s.salary,
  15. @rank:=if(@last_s = s.salary,@rank,@rank+1) as rk,
  16. @last_s:=s.salary
  17. from salaries s,(select @rank:=0,@last_s:=0) t
  18. where
  19. s.salary between 39200 and 39220
  20. order by s.salary desc
  21. ) r;
  22. </code>
  1. <code>salary
  2. rk
  3. 39217
  4. 1
  5. 39217
  6. 1
  7. 39216
  8. 2
  9. 39215
  10. 3
  11. 39212
  12. 4
  13. 39206
  14. 5
  15. 39205
  16. 6
  17. 39202
  18. 7
  19. 39202
  20. 7
  21. 39201
  22. 8
  23. 39200
  24. 9
  25. </code>

高级并列排名,相同值排名相同,但是rank值始终递增

使用一个@irk变量来递增排名值;
同时使用另一个@rank变量来保持不变的排名值;

  1. <code class="language-sql">select salary , rk from
  2. (
  3. select s.salary,
  4. @rank:=if(@last_s=s.salary,@rank,@irk+1) as rk,
  5. @irk:=@irk+1,
  6. @last_s:=s.salary
  7. from salaries s,(select @rank:=0,@irk:=0,@last_s:=0) t
  8. where
  9. s.salary between 39200 and 39220
  10. order by s.salary desc
  11. ) s;
  12. </code>
  1. <code>salary
  2. rk
  3. 39217
  4. 1
  5. 39217
  6. 1
  7. 39216
  8. 3
  9. 39215
  10. 4
  11. 39212
  12. 5
  13. 39206
  14. 6
  15. 39205
  16. 7
  17. 39202
  18. 8
  19. 39202
  20. 8
  21. 39201
  22. 10
  23. 39200
  24. 11
  25. </code>

分组Rank排名

查询这(‘1985-01-01 1986-01-01‘,‘1985-02-03 1986-02-03‘)两个时期, 各时期的薪资排名

普通排名

  1. <code class="language-sql">SELECT
  2. emp_no,
  3. period ,
  4. salary ,
  5. if(@pre_t=period,@rank:=@rank+1,@rank:=1) as rk,
  6. @pre_t:=period
  7. FROM
  8. (
  9. SELECT emp_no,
  10. concat(from_date,‘ ‘,to_date) period ,
  11. salary
  12. FROM salaries
  13. ) t1 ,
  14. (select @rank:=0,@pre_t:=0) t2
  15. where
  16. period in (‘1985-01-01 1986-01-01‘,‘1985-02-03 1986-02-03‘)
  17. order by period , salary desc
  18. ;
  19. </code>
  1. <code>period,salary,rk
  2. "1985-01-01 1986-01-01",72446,1
  3. "1985-01-01 1986-01-01",71612,2
  4. "1985-01-01 1986-01-01",71166,3
  5. "1985-01-01 1986-01-01",61357,4
  6. "1985-01-01 1986-01-01",60026,5
  7. "1985-01-01 1986-01-01",48626,6
  8. "1985-01-01 1986-01-01",48291,7
  9. "1985-01-01 1986-01-01",42093,8
  10. "1985-01-01 1986-01-01",40000,9
  11. "1985-02-03 1986-02-03",90217,1
  12. "1985-02-03 1986-02-03",88375,2
  13. "1985-02-03 1986-02-03",87439,3
  14. "1985-02-03 1986-02-03",84359,4
  15. "1985-02-03 1986-02-03",76874,5
  16. "1985-02-03 1986-02-03",76683,6
  17. "1985-02-03 1986-02-03",75713,7
  18. "1985-02-03 1986-02-03",75105,8
  19. "1985-02-03 1986-02-03",71024,9
  20. ...
  21. "1985-02-03 1986-02-03",40000,61
  22. </code>

并列排名

  1. <code class="language-sql">select period,salary,rk from (
  2. SELECT
  3. period ,
  4. salary ,
  5. if(@pre_t=period,if(@pre_s=salary,@rank,@rank:=@rank+1),@rank:=1) as rk,
  6. @pre_t:=period,
  7. @pre_s:=salary
  8. FROM
  9. (
  10. SELECT emp_no,
  11. concat(from_date,‘ ‘,to_date) period ,
  12. salary
  13. FROM salaries
  14. ) t1 ,
  15. (select @rank:=0,@pre_t:=0,@pre_s:=0) t2
  16. where
  17. period in (‘1985-01-01 1986-01-01‘,‘1985-02-03 1986-02-03‘)
  18. order by period , salary desc
  19. ) ft;
  20. </code>
  1. <code>period,salary,rk
  2. "1985-01-01 1986-01-01",72446,1
  3. "1985-01-01 1986-01-01",71612,2
  4. "1985-01-01 1986-01-01",71166,3
  5. "1985-01-01 1986-01-01",61357,4
  6. "1985-01-01 1986-01-01",60026,5
  7. "1985-01-01 1986-01-01",48626,6
  8. "1985-01-01 1986-01-01",48291,7
  9. "1985-01-01 1986-01-01",42093,8
  10. "1985-01-01 1986-01-01",40000,9
  11. "1985-02-03 1986-02-03",90217,1
  12. "1985-02-03 1986-02-03",88375,2
  13. "1985-02-03 1986-02-03",87439,3
  14. "1985-02-03 1986-02-03",84359,4
  15. "1985-02-03 1986-02-03",76874,5
  16. "1985-02-03 1986-02-03",76683,6
  17. "1985-02-03 1986-02-03",75713,7
  18. "1985-02-03 1986-02-03",75105,8
  19. "1985-02-03 1986-02-03",71024,9
  20. "1985-02-03 1986-02-03",66319,10
  21. "1985-02-03 1986-02-03",66138,11
  22. ...
  23. "1985-02-03 1986-02-03",40000,39
  24. "1985-02-03 1986-02-03",40000,39
  25. "1985-02-03 1986-02-03",40000,39
  26. "1985-02-03 1986-02-03",40000,39
  27. "1985-02-03 1986-02-03",40000,39
  28. "1985-02-03 1986-02-03",40000,39
  29. "1985-02-03 1986-02-03",40000,39
  30. "1985-02-03 1986-02-03",40000,39
  31. </code>

高级并列排名

  1. <code class="language-sql">select period,salary,rk from (
  2. SELECT
  3. period ,
  4. salary ,
  5. if(@pre_t=period,@irk:=@irk+1,@irk:=1) as irk,
  6. if(@pre_t=period,if(@pre_s=salary,@rank,@rank:=@irk),@rank:=@irk) as rk,
  7. @pre_t:=period,
  8. @pre_s:=salary
  9. FROM
  10. (
  11. SELECT emp_no,
  12. concat(from_date,‘ ‘,to_date) period ,
  13. salary
  14. FROM salaries
  15. ) t1 ,
  16. (select @rank:=0,@pre_t:=0,@pre_s:=0,@irk:=0) t2
  17. where
  18. period in (‘1985-01-01 1986-01-01‘,‘1985-02-03 1986-02-03‘)
  19. order by period , salary desc
  20. ) ft;
  21. </code>
  1. <code>period,salary,rk
  2. "1985-01-01 1986-01-01",72446,1
  3. "1985-01-01 1986-01-01",71612,2
  4. "1985-01-01 1986-01-01",71166,3
  5. "1985-01-01 1986-01-01",61357,4
  6. "1985-01-01 1986-01-01",60026,5
  7. "1985-01-01 1986-01-01",48626,6
  8. "1985-01-01 1986-01-01",48291,7
  9. "1985-01-01 1986-01-01",42093,8
  10. "1985-01-01 1986-01-01",40000,9
  11. "1985-02-03 1986-02-03",90217,1
  12. "1985-02-03 1986-02-03",88375,2
  13. "1985-02-03 1986-02-03",87439,3
  14. "1985-02-03 1986-02-03",84359,4
  15. "1985-02-03 1986-02-03",76874,5
  16. "1985-02-03 1986-02-03",76683,6
  17. "1985-02-03 1986-02-03",75713,7
  18. "1985-02-03 1986-02-03",75105,8
  19. "1985-02-03 1986-02-03",71024,9
  20. "1985-02-03 1986-02-03",66319,10
  21. "1985-02-03 1986-02-03",66138,11
  22. ...
  23. "1985-02-03 1986-02-03",40000,39
  24. "1985-02-03 1986-02-03",40000,39
  25. "1985-02-03 1986-02-03",40000,39
  26. "1985-02-03 1986-02-03",40000,39
  27. "1985-02-03 1986-02-03",40000,39
  28. "1985-02-03 1986-02-03",40000,39
  29. "1985-02-03 1986-02-03",40000,39
  30. "1985-02-03 1986-02-03",40000,39
  31. </code>

因为数据的问题,结果和并列排名没有区别.

SQL-Rank-Example

标签:com   数据   ref   包含   data   http   end   select   desc   

人气教程排行