目录
应用一:将salary列降序排列,emp_no列升序排列,并输出序号
应用二:将dept_no列进行升序排序,相同dept_no的数据在进行salary列进行降序排列及emp_no升序排列。
应用一:将salary列降序排列,emp_no列升序排列,并输出序号
表中数据:
salaries表
dept_no | emp_no | salary |
1 | 10001 | 88958 |
1 | 10002 | 72527 |
1 | 10003 | 43311 |
2 | 10004 | 72527 |
2 | 10005 | 43311 |
1 | 10006 | 72527 |
2 | 10007 | 72527 |
方式一:窗口函数(需要MySQL8.0以上版本)
1、忽略重复值,序号依次排序row_number()
select emp_no, salary, row_number() over (ORDER BY salary DESC) t_rank
from salaries
order by salary desc, emp_no
2、重复值序号相同,序号不连续rank()
select emp_no, salary, rank() over (ORDER BY salary DESC) t_rank
from salaries
order by salary desc, emp_no
3、重复值序号相同,序号连续dense_rank()
select emp_no, salary, dense_rank() over (ORDER BY salary DESC) t_rank
from salaries
order by salary desc, emp_no
方式二:使用变量
1、忽略重复值,序号依次排序
set @rank = 0;
select emp_no, salary, @rank := @rank + 1 t_rank
from salaries
order by salary desc, emp_no;
2、重复值序号相同,序号不连续
<------------------------------>
3、重复值序号相同,序号连续
set @rank = 0, @prev = NULL;
select emp_no,
salary,
case
when @prev = salary then #首先判断是否与上一次的值相同,若相同返回相同的序号
@rank
when @prev := salary then #当上一个条件不满足时,执行这个语句,首先进行赋值,然后序号自增
@rank := @rank + 1
end t_rank
from salaries
order by salary desc, emp_no;
应用二:将dept_no列进行升序排序,相同dept_no的数据在进行salary列进行降序排列及emp_no升序排列。
方式一:窗口函数
此处以row_number()为例,其他方法类似。
select dept_no, emp_no, salary, row_number() over (partition by dept_no ORDER BY salary DESC) t_rank
from salaries
order by dept_no, t_rank;
方式二:
select s.dept_no,
s.emp_no,
s.salary,
(select count(distinct salary) salary
from salaries
where salary >= s.salary
and dept_no = s.dept_no) t_rank
from salaries s
order by dept_no, t_rank;