ITPub博客

首页 > 自动化运维 > DevOps > SQL 并列排序 排序跳增

SQL 并列排序 排序跳增

原创 DevOps 作者:Jusly2018 时间:2018-07-02 15:49:03 0 删除 编辑

 

SQL根据多个字段排序,实现并列排序,排序跳跃。如1,1,3,4,5,5,7排列。

 

例如职工薪资表,包括用户ID,部门ID,工作职能,薪资,以相同部门ID,工作职能,按薪资进行降序排列。薪资相同排序号相同,后面的排序跳增。

/*创建测试表,插入数据*/

DROP TABLE IF EXISTS test.emp_salary;

CREATE TABLE `emp_salary` (

  `empid` VARCHAR(10) DEFAULT NULL,

  `deptid` VARCHAR(10) DEFAULT NULL,

  `job` VARCHAR(30) DEFAULT NULL,

  `salary` DECIMAL(10,2) DEFAULT NULL

) ENGINE=INNODB DEFAULT CHARSET=utf8;

TRUNCATE TABLE emp_salary;

INSERT INTO `emp_salary` VALUES

('0001', 'D040','自然语言处理工程师','25000.00')

,('0002', 'D040','数据采集专员', NULL)

,('0003', 'D040','爬虫开发工程师', '25000.00')

,('0004', 'D040','数据仓库工程师', '30000.00')

,('0005', 'D040','数据仓库工程师', '18000.00')

,('0006', 'D040','数据仓库工程师', '18000.00')

,('0007', 'D040','数据仓库工程师', '16000.00')

,('0008', 'D050','Java开发工程师', '16000.00')

,('0009', 'D050','Java开发工程师', '22000.00')

,('0010', 'D050','Java开发工程师', '22000.00')

,('0011', 'D050','Java开发工程师', '18000.00')

,('0012', 'D050','Java开发工程师', '18000.00');

 

 

/*实现按照部门,按工作分组,按salary降序排序项*/

/*  SQL1-1 */

SELECT empid,deptid,job,salary,(CASE WHEN salary IS NULL THEN NULL ELSE rank END ) AS rank

FROM  

( SELECT tmp.empid,tmp.deptid,tmp.job,tmp.salary

,@rownum := @rownum + 1

,IF(@dept = tmp.deptid AND @job = tmp.job AND @salary >= tmp.salary,@rank := @rank + 1,@rank := 1) AS rank

,@dept := tmp.deptid

,@job := tmp.job

,@salary := tmp.salary

FROM

(SELECT empid,deptid,job,salary FROM emp_salary ORDER BY deptid,job,salary DESC) tmp,

(SELECT @rownum := 0,@dept := NULL,@rank := 0) a

) result ;

/* 或者*/

/*  SQL1-2 */

SET @row := 0 ;

SET @curDep := '' ;

SET @curJob := '' ;

SET @curSal := 0 ;

SELECT empid,deptid,job,salary

,CASE WHEN salary IS NULL THEN NULL

WHEN @curDep = deptid AND @curJob = job THEN @row := @row + 1

WHEN @curDep <> deptid OR @curJob <> job THEN @row := 1

END rank

,@curDep := deptid

,@curJob := job

,@curSal := salary

FROM emp_salary

ORDER BY deptid,job,salary DESC;

 

得到的排序如图1-1

 

 

/*  SQL2-1 */

SET @row := 0 ;

SET @curDep := '' ;

SET @curJob := '' ;

SET @curSal := 0 ;

SELECT empid,deptid,job,salary

,CASE WHEN salary IS NULL THEN NULL

WHEN @curDep = deptid AND @curJob = job AND @curSal > salary THEN @row := @row + 1

WHEN @curDep = deptid AND @curJob = job AND @curSal = salary THEN @row := @row  

WHEN @curDep <> deptid OR @curJob <> job THEN @row := 1

END rank

,@curDep := deptid

,@curJob := job

,@curSal := salary

FROM emp_salary

ORDER BY deptid,job,salary DESC;

得到排序如图2-1:



/*  SQL3-1 */

SELECT empid,deptid,job,salary,(CASE WHEN salary IS NULL THEN NULL ELSE rank END) rank

FROM

( SELECT empid,deptid,job,salary

,(SELECT COUNT(1)+1 FROM emp_salary t WHERE t.deptid=s.deptid AND t.job=s.job AND t.salary>s.salary) AS rank

FROM emp_salary s

ORDER BY deptid,job,salary DESC

) result;

得到排序如图3-1:

 

 

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31525738/viewspace-2157200/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2018-03-14

  • 博文量
    3
  • 访问量
    4555