首页 > 试题广场 >

查找最晚入职员工的所有信息

[编程题]查找最晚入职员工的所有信息
  • 热度指数:761348 时间限制: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
10004
1954-05-01 Christian  
Koblick   
M    
1986-12-01 
示例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');

输出

10008|1958-02-19|Saniya|Kalloufi|M|1994-09-15
窗口函数方法:
with a as(
	select *,
	rank() over(order by hire_date desc) as rn
	from employees
)

select emp_no, birth_date, first_name, 
last_name, gender, hire_date
from a
where rn = 1


编辑于 2024-03-21 16:10:18 回复(0)
select * from employees 
order by hire_date desc 
limit 1;

发表于 2024-02-05 11:37:01 回复(0)
select
emp_no
,birth_date,first_name,last_name,gender,hire_date
from(
select *
,rank()over(partition by emp_no order by hire_date desc) posn
from employees
) re
where posn=1
limit 1
发表于 2024-01-26 11:59:12 回复(0)
select * from employees
where hire_date =
(select max(hire_date) from employees)
编辑于 2024-01-10 16:06:31 回复(0)
遇事不决,开窗函数
select e.emp_no,
e.birth_date,
e.first_name,
e.last_name,
e.gender,
e.hire_date
from
(select emp_no,
birth_date,
first_name,
last_name,
gender,
hire_date,
dense_rank() over(order by hire_date desc) as rk
from employees) as e
where e.rk = 1

编辑于 2024-01-03 16:10:32 回复(0)
除了MAX函数,也用 all运算符
SELECT * FROM employees
where hire_date>=all(select hire_date from employees )
发表于 2023-10-19 11:24:55 回复(0)
# 请你查找employees里最晚入职员工的所有信息,以上例子输出如下:

# 方法1 row_number
# select emp_no,birth_date,first_name,last_name,gender ,hire_date from (
# select 
#   emp_no,birth_date,first_name,last_name,gender,hire_date,
#   row_number() over(order by hire_date desc) rn
# from employees
# ) tt 
# where tt.rn =1 

# 方法2 max()over()
# select emp_no,birth_date,first_name,last_name,gender ,hire_date from (
# select 
#   emp_no,birth_date,first_name,last_name,gender,hire_date,
#   max(hire_date) over() max_hire_date
# from employees
# ) tt 
# where max_hire_date=hire_date;

# 方法3 first_value()over()
select emp_no,birth_date,first_name,last_name,gender ,hire_date from (
select 
  emp_no,birth_date,first_name,last_name,gender,hire_date,
  first_value(hire_date) over( order by hire_date desc) max_hire_date
from employees
) tt 
where max_hire_date=hire_date;

发表于 2023-08-14 16:06:30 回复(0)
select distinct
    *
from employees
where
    hire_date in (
        (
            select
                max(hire_date) as min_date
            from
                employees
        )
    )
发表于 2023-06-27 23:20:20 回复(0)
SELECT top 1 * from employees order by hire_date desc;
发表于 2023-03-04 13:28:29 回复(1)

【场景】:查找最大值的所有信息

【分类】:in子查询

分析思路

难点:

1.考虑到最晚入职的员工不止一名的情况。

员工表中的入职时间是只记录到天没有精确到秒,会有可能出现最晚入职的员工不止一名的情况。所以这也在启发我们建表的时候最好考虑到这种情况,把入职时间精确到秒。

如果有多名员工最晚入职如何查找

分两步走,一、先找到入职最晚(最大)日期;二、再根据日期筛选员工信息。

  • [使用]:in、= 子查询

扩展

前往查看:MySQL 嵌套子查询 with子句 from子查询 in子查询 join子查询

错误代码

对入职日期倒排序,取第一条数据。

#错误解法
select *
from employees
order by hire_date desc
limit 1

求解代码

方法一:

in 子查询

select 
    emp_no,
    birth_date,
    first_name,
    last_name,
    gender,
    hire_date
from employees
where hire_date in (
    select
        max(hire_date) as max_date
    from employees)

方法二:

= 子查询

select 
    emp_no,
    birth_date,
    first_name,
    last_name,
    gender,
    hire_date
from employees
where hire_date = (
    select
        max(hire_date) as max_date
    from employees)
发表于 2023-03-03 18:30:49 回复(0)
select 
emp_no,
birth_date,
first_name,
last_name,
gender,
hire_date
from employees
order by hire_date desc
limit 1;



发表于 2022-12-01 20:55:39 回复(0)
/*
select * from employees 
    order by hire_date desc 
    limit 1;
*/

/* 使用limit 与 offset关键字  */
/*
select * from employees 
    order by hire_date desc 
    limit 1 offset 0;
*/

/* 使用limit关键字 从第0条记录 向后读取一个,也就是第一条记录 */
/*
select * from employees 
    order by hire_date desc 
    limit 0,1;
*/

/* 使用子查询,最后一天的时间有多个员工信息 */
/*
select * from employees
    where hire_date = (select max(hire_date) from employees);
*/

发表于 2022-09-28 13:02:54 回复(0)
select 
    emp_no,
    birth_date,
    first_name,
    last_name,
    gender,
    hire_date
from 
    (select *,                   
            dense_rank() over(order by hire_date desc) as rnk 
    from employees) t
where t.rnk=1
发表于 2022-08-23 17:24:10 回复(0)
select * from employees order by hire_date desc limit 0,1;

发表于 2022-08-23 15:51:22 回复(0)
SELECT emp_no, birth_date,first_name,last_name,gender,hire_date
FROM (
SELECT *, 
       rank()over(order by hire_date desc) rk
FROM employees
)t
WHERE rk=1
发表于 2022-08-16 18:55:46 回复(0)
select * from employees where hire_date = (select max(hire_date) from employees);
发表于 2022-08-12 14:25:40 回复(0)
思虑要周全

发表于 2022-07-30 13:01:47 回复(0)