• 不用order by 选出第二个人


    SQL212 获取当前薪水第二多的员工的emp_no以及其对应的薪水salary

    • 题目
    • 题解(273)
    • 讨论(774)
    • 排行
    • 面经

      new

    较难  通过率:28.24%  时间限制:1秒  空间限制:32M

    描述

    有一个员工表employees简况如下:

    emp_no birth_date first_name last_name genderhire_date 
    100011953-09-02Georgi     Facello    M1986-06-26
    100021964-06-02Bezalel    Simmel     F1985-11-21
    10003  1959-12-03Parto      Bamford    M1986-08-28
    10004  1954-05-01Chirstian  Koblick    M1986-12-01

    有一个薪水表salaries简况如下:

    emp_no salaryfrom_date to_date
    10001889582002-06-269999-01-01
    10002725272001-08-029999-01-01
    10003433112001-12-019999-01-01
    10004740572001-11-279999-01-01

    请你查找薪水排名第二多的员工编号emp_no、薪水salary、last_name以及first_name,不能使用order by完成,以上例子输出为:

    (温馨提示:sqlite通过的代码不一定能通过mysql,因为SQL语法规定,使用聚合函数时,select子句中一般只能存在以下三种元素:常数、聚合函数,group by 指定的列名。如果使用非group by的列名,sqlite的结果和mysql 可能不一样)

    emp_no salarylast_namefirst_name
    1000474057KoblickChirstian

    示例1

    输入:

    drop table if exists  `employees` ; 
    drop table if exists  `salaries` ; 
    CREATE TABLE `employees` (
    `emp_no` int(11) NOT NULL,
    `birth_date` date NOT NULL,
    `first_name` varchar(14) NOT NULL,
    `last_name` varchar(16) NOT NULL,
    `gender` char(1) NOT NULL,
    `hire_date` date NOT NULL,
    PRIMARY KEY (`emp_no`));
    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 employees VALUES(10001,'1953-09-02','Georgi','Facello','M','1986-06-26');
    INSERT INTO employees VALUES(10002,'1964-06-02','Bezalel','Simmel','F','1985-11-21');
    INSERT INTO employees VALUES(10003,'1959-12-03','Parto','Bamford','M','1986-08-28');
    INSERT INTO employees VALUES(10004,'1954-05-01','Chirstian','Koblick','M','1986-12-01');
    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,74057,'2001-11-27','9999-01-01');

    复制输出:

    10004|74057|Koblick|Chirstian

    1. select employees.emp_no, s1.salary, last_name, first_name
    2. from employees
    3. left join salaries s1
    4. on employees.emp_no = s1.emp_no
    5. where (
    6. select sum(s2.salary>s1.salary)
    7. from salaries s2
    8. ) = 1 -- sum值为1的说明取得第二个人 sum值为 n 的 说明取得是排名为 n+1的人

    用的max

    1. with t1 as (
    2. select
    3. max(salary) salary_2_max
    4. from
    5. salaries
    6. where salary != (
    7. select
    8. max(salary)
    9. from
    10. salaries)
    11. )
    12. select
    13. employees.emp_no,salaries.salary,employees.last_name,employees.first_name
    14. from
    15. t1 join salaries join employees
    16. on t1.salary_2_max = salaries.salary and salaries.emp_no = employees.emp_no

  • 相关阅读:
    Java-访问修饰符
    计算机毕业设计(附源码)python自动出卷考试系统
    2022年双十一百亿补贴,2022年聚划算双11玩法解读
    getBean方法源码
    MyBatis---缓存-提高检索效率的利器
    Zookeeper
    RAII技术学习
    【QT】QtConcurrent的使用介绍,与std::thread的区别
    javaScript能做什么
    软件项目可行性研究报告
  • 原文地址:https://blog.csdn.net/m0_69157845/article/details/126240084