首页 > 数据库 >SQL217 对所有员工的薪水按照salary降序进行1-N的排名

SQL217 对所有员工的薪水按照salary降序进行1-N的排名

时间:2024-04-27 10:56:12浏览次数:28  
标签:SQL217 salary 01 no 降序 salaries date s1


示例:

drop table if exists `salaries` ; 
CREATE TABLE `salaries` (
`emp_no` int(11) NOT NULL,
`salary` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`from_date`));
INSERT INTO salaries VALUES(10001,88958,'2002-06-22','9999-01-01');
INSERT INTO salaries VALUES(10002,72527,'2001-08-02','9999-01-01');
INSERT INTO salaries VALUES(10003,43311,'2001-12-01','9999-01-01');
INSERT INTO salaries VALUES(10004,72527,'2001-12-01','9999-01-01');

在 MySQL 8.0之前,没法使用窗口函数,所以要考虑不使用窗口函数如何实现。
本地的主要思想是表的自关联,通过两张表salary的比对就可以知道表1的salary比表2的salary低的数据有多少了。
比如,通过 s1.salary <= s2.salary,可得到 salary2 这一列是对于每个员工有多少员工比自己薪水高的数据。

SELECT
  s1.emp_no, s1.salary salary1, s2.salary salary2
FROM salaries s1
JOIN salaries s2 ON s1.salary <= s2.salary
ORDER BY s1.emp_no ASC;
+--------+---------+---------+
| emp_no | salary1 | salary2 |
+--------+---------+---------+
|  10001 |   88958 |   88958 |
|  10002 |   72527 |   72527 |
|  10002 |   72527 |   88958 |
|  10002 |   72527 |   72527 |
|  10003 |   43311 |   72527 |
|  10003 |   43311 |   88958 |
|  10003 |   43311 |   72527 |
|  10003 |   43311 |   43311 |
|  10004 |   72527 |   72527 |
|  10004 |   72527 |   88958 |
|  10004 |   72527 |   72527 |
+--------+---------+---------+

然后分组后使用 distinct 排除自己得到了排名,最终答案:

SELECT
	tt.emp_no, s.salary, tt.t_rank
FROM	(
	SELECT s1.emp_no, COUNT(DISTINCT s2.salary) t_rank
	FROM salaries s1, salaries s2
	WHERE s1.salary <= s2.salary
	GROUP BY s1.emp_no) tt
JOIN salaries s ON s.emp_no = tt.emp_no
ORDER BY tt.t_rank ASC;
+--------+--------+--------+
| emp_no | salary | t_rank |
+--------+--------+--------+
|  10001 |  88958 |      1 |
|  10004 |  72527 |      2 |
|  10002 |  72527 |      2 |
|  10003 |  43311 |      3 |
+--------+--------+--------+

标签:SQL217,salary,01,no,降序,salaries,date,s1
From: https://www.cnblogs.com/cloudrich/p/18159101

相关文章

  • java8中,Arrays.sort()默认是升序的,对于基本数据类型,使其降序怎么实现
    对于引用数据类型,自定义比较器对象,实现Comparator接口/Comparable接口对于基本数据类型,自定义比较器对象,将基本数据类型转换成对应的包装类型即可但是这样写是错误的,importjava.util.Arrays;importjava.util.Comparator;publicclassSortExample{publicstatic......
  • MYSQL学习笔记9: DQL排序查询(升降序)
    DQL排序查询select字段列表from表名orderby字段1排序方式1,字段2排序方式2;排序方式ASC升序(默认)DESC降序如果是多字段排序,第一个字段值相同,会根据第二个字段的值进行排序,以此类推按年龄降序排序select*fromworkersorderbyagedesc;......
  • E - Revenge of "The Salary of AtCoder Inc."
    E-Revengeof"TheSalaryofAtCoderInc."ProblemStatementAoki,anemployeeatAtCoderInc.,hashissalaryforthismonthdeterminedbyaninteger$N$andasequence$A$oflength$N$asfollows.First,heisgivenan$N$-sideddie(dice)th......
  • vue升序降序按钮功能实现
    需求:默认升序,悬浮按钮变色,点击按钮下标跟随变化。html<divclass="right"@click="change(item,index)"v-for="(item,index)inbtnList":key="index">{{item.lable}}<divclass="......
  • [20231105]降序索引的疑问.txt
    [20231105]降序索引的疑问.txt--//我们生产系统有一套系统我以前维护过,出现一个奇葩现象,建立一堆降序索引,实际上完全没有必要,最后我改了许多索引为普通索引.--//由于可能后续维护或者可能是我遗漏了(当然还有可能索引太大我没有修改),还是有一些索引没改过来.--//我讲过降序索......
  • sql 按字段升降序,NULL排最后
     //CASE表达式来对LastAuthTime字段进行逻辑判断,当LastAuthTime为NULL时,赋予它一个比非空值更大的排序权重。这样,查询结果中的NULL值将会显示在最后面。SELECT*FROMTbUserORDERBYCASEWHENLastAuthTimeISNULLTHEN1ELSE0END,LastAuthTimeASC ......
  • AT_abc326_e Revenge of "The Salary of AtCoder Inc." 题解
    AT_abc326_eRevengeof"TheSalaryofAtCoderInc."题解一道简单的概率论+动态规划题目(然而我赛时没看这道题题意有一个长度为\(n\)的序列\(A\)、一个\(n\)面骰子,掷若干次骰子,如果这一次掷骰子的点数小于等于上一次的点数,则结束。定义这若干次掷骰子的总的结果为,每次......
  • 排序 order by 默认升序;降序 desc;两个条件一起使用时使用逗号隔开
     #先用工资排序,如果工资相等,再用名字排序select*fromemporderbysaldesc,ENAMEdesc;  ......
  • SQLAlchemy学习-12.查询之 order_by 按desc 降序排序
    前言sqlalchemy的query默认是按id升序进行排序的,当我们需要按某个字段降序排序,就需要用到order_by。order_by排序默认情况下sqlalchemy的query默认是按id升序进行排序的res=session.query(Project).all()print(res)#[<Project(id='1',project_name='string'.........
  • 输入若干个数值存入数组中,采用冒泡算法进行升序或降序排序
    [12:38:09root@centos8~]#bashsort.shbeforesort:1475626459133973060324422175901602255661082520888121022092421146668557255975852542867817400aftersort:3060328678264592442220888175901740016022147561339711466108259758924272......