首页 > 试题广场 >

查找入职员工时间排名倒数第三的员工所有信息

[编程题]查找入职员工时间排名倒数第三的员工所有信息
  • 热度指数:808018 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
有一个员工employees表简况如下:
emp_no
birth_date
first_name
last_name
gender hire_date
10001
1953-09-02
Georgi
Facello
M 1986-06-26
10002
1964-06-02
Bezalel
Simmel
F 1985-11-21
10003
1959-12-03
Parto
Bamford
M 1986-08-28
10004
1954-05-01
Christian
Koblick
M 1986-12-01

请你查找employees里入职员工时间排名倒数第三的员工所有信息,以上例子输出如下:
emp_no
birth_date
first_name
last_name
gender
hire_date
10001
1953-09-02
Georgi
Facello
M 1986-06-26
注意:可能会存在同一个日期入职的员工,所以入职员工时间排名倒数第三的员工可能不止一个。
示例1

输入

drop table if exists  `employees` ; 
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`));
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 employees VALUES(10005,'1955-01-21','Kyoichi','Maliniak','M','1989-09-12');
INSERT INTO employees VALUES(10006,'1953-04-20','Anneke','Preusig','F','1989-06-02');
INSERT INTO employees VALUES(10007,'1957-05-23','Tzvetan','Zielinski','F','1989-02-10');
INSERT INTO employees VALUES(10008,'1958-02-19','Saniya','Kalloufi','M','1994-09-15');
INSERT INTO employees VALUES(10009,'1952-04-19','Sumant','Peac','F','1985-02-18');
INSERT INTO employees VALUES(10010,'1963-06-01','Duangkaew','Piveteau','F','1989-08-24');
INSERT INTO employees VALUES(10011,'1953-11-07','Mary','Sluis','F','1990-01-22');

输出

10005|1955-01-21|Kyoichi|Maliniak|M|1989-09-12
SELECT *
FROM employees
WHERE hire_date = (
    SELECT DISTINCT hire_date
    FROM employees
    ORDER BY hire_date DESC
    LIMIT 1 OFFSET 2
)
ORDER BY emp_no;
前提emp_no要唯一
发表于 2024-04-24 17:37:38 回复(0)
为什么不对啊?
select *
from 
(
select *,
rank()over(order by hire_date desc) posn
from employees
) rk
where rk.posn=3

发表于 2024-04-03 16:10:22 回复(0)
窗口函数实现如下
select a.emp_no,a.birth_date,a.first_name,a.last_name,a.gender,a.hire_date
from
(select *,dense_rank()over(order by hire_date desc) ran
from employees) a
where a.ran=3


编辑于 2024-03-24 16:36:05 回复(0)
select * from employees where hire_date=(select distinct hire_date from employees order by hire_date desc limit 2,1);    为什么必须加distinct才能通过?  想不明白 0-0
编辑于 2024-02-22 15:54:33 回复(0)
select * from employees
where hire_date =
(select distinct a.hire_date from employees a order by a.hire_date desc limit 2,1);

发表于 2024-02-05 11:53:02 回复(0)
SELECT * FROM employees
ORDER BY hire_date DESC
LIMIT 2,1
编辑于 2024-02-02 18:20:42 回复(0)
先排序,在提取,顺序不能错
编辑于 2024-01-26 16:59:52 回复(0)
SELECT
    *
FROM
    employees
WHERE hire_date =
    (SELECT
         DISTINCT hire_date
     FROM
         employees
     ORDER BY
         hire_date DESC
     LIMIT 1 OFFSET 2)
比较正式的写法
发表于 2024-01-24 14:00:56 回复(0)
with a as (
    select *
    ,dense_rank() over(order by hire_date desc) as rank1
    from employees
)
select emp_no,birth_date,first_name,last_name,gender,hire_date
from a
where rank1 = 3

编辑于 2023-12-17 18:36:20 回复(0)
select
    *
from
    employees
where
    hire_date = (
        select
            hire_date
        from
            employees
        group by
            hire_date
        order by
            hire_date desc
        limit
            2, 1
    )
编辑于 2023-12-12 18:21:21 回复(0)
select emp_no,birth_date,first_name,last_name,gender,hire_date from (select *,dense_rank()over(order by hire_date desc) rk from employees)new where new.rk=3
dense_rank() :并列连续型排序——99,99,98,97的排序方式为1,1,2,3,
发表于 2023-10-30 16:23:22 回复(0)
select emp_no,birth_date,first_name,last_name,gender,hire_date
from
    (select *,dense_rank() over(order by hire_date desc) as ranks
    from employees) as temp
where temp.ranks=3
先编号,再筛选
发表于 2023-10-23 18:25:22 回复(0)
with t1 as(
select *,dense_rank() over(partition by null order by hire_date desc) as rn from employees)
select emp_no,
birth_date,
first_name,
last_name,
gender,hire_date from t1 where rn = 3;
发表于 2023-09-14 15:59:09 回复(0)
# 请你查找employees里入职员工时间排名倒数第三的员工所有信息,以上例子输出如下:
# 本题考查:dense_rank 连续有多次;

with dwd_data as (
select 
*,
dense_rank()over(order by hire_date desc ) rn 
from employees
)

select 
emp_no,
birth_date,
first_name,
last_name,
gender,
hire_date
from dwd_data where rn =3
order by 1;

发表于 2023-09-11 11:39:24 回复(0)
select
  *
from employees as t1
where (select 
        count(distinct t2.hire_date)
      from employees as t2
      where t1.hire_date <= t2.hire_date
      ) = 3;

通用的获取第几大的sql语句,主要采用的联表查询,通过联表查询,来找出t2表中大于等于t1.hire_date的不同的hire_date只有3个,那么就可以将t1这条记录返回了。

发表于 2023-09-10 23:51:44 回复(0)
select emp_no,birth_date,first_name,last_name,gender,hire_date from 
employees e join 
(select hire_date,dense_rank()over(order by hire_date desc) from employees limit 2,1)s using (hire_date)
为什么这个通过不了呀


发表于 2023-07-14 13:35:29 回复(0)
select emp_no, birth_date, first_name, last_name, gender, hire_date from employees
where hire_date=
    (select distinct hire_date 
    from employees
    order by hire_date desc
    limit 2,1);

发表于 2023-06-14 13:21:51 回复(0)
select
    *
from
    employees
where
    hire_date = (
        select
            distinct(hire_date) as hire_date
        from
            employees
        order by
            hire_date desc
        limit
            2, 1
    );
关键在去重
发表于 2023-04-28 14:21:31 回复(0)
使用窗口函数 但是感觉有点麻烦
SELECT emp_no, birth_date, first_name, last_name,gender, hire_date 
FROM (
    SELECT DENSE_RANK() OVER(ORDER BY hire_date DESC) AS NO,
    emp_no, birth_date, first_name, last_name,gender, hire_date
    FROM employees ) AS E1
WHERE NO=3


发表于 2023-04-23 16:14:27 回复(0)

问题信息

难度:
200条回答 104248浏览

热门推荐

通过挑战的用户

查看代码