目录

应用一:将salary列降序排列,emp_no列升序排列,并输出序号

表中数据:

salaries表

方式一:窗口函数(需要MySQL8.0以上版本)

1、忽略重复值,序号依次排序row_number()

2、重复值序号相同,序号不连续rank()

3、重复值序号相同,序号连续dense_rank()

 方式二:使用变量

1、忽略重复值,序号依次排序

2、重复值序号相同,序号不连续

3、重复值序号相同,序号连续

应用二:将dept_no列进行升序排序,相同dept_no的数据在进行salary列进行降序排列及emp_no升序排列。

方式一:窗口函数

方式二:


应用一:将salary列降序排列,emp_no列升序排列,并输出序号

表中数据:

salaries表

dept_noemp_nosalary
11000188958
11000272527
11000343311
21000472527
21000543311
11000672527
21000772527

方式一:窗口函数(需要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;

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐