首页 > 试题广场 >

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

[编程题]查找最晚入职员工的所有信息
  • 热度指数:783966 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
有一个员工employees表简况如下:

请你查找employees里最晚入职员工的所有信息,以上例子输出如下:

示例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
SELECT a.emp_no,
a.birth_date,
a.first_name,
a.last_name,
a.gender,
a.hire_date
FROM(SELECT
emp_no,
birth_date,
first_name,
last_name,
gender,
hire_date,
RANK() OVER(ORDER BY hire_date DESC) rank_date
FROM employees) a
WHERE a.rank_date =1
想复杂了,用窗口函数做出来的
发表于 2024-11-17 17:05:48 回复(0)
select
    *
from
    employees
order by
    hire_date desc
limit
    1


发表于 2024-10-05 13:44:58 回复(0)
select *
from employees
where hire_date in (
    select max(hire_date) as last_hire_date
    from employees)
关键点:找到最晚入职时间
因无法确认最晚入职是否只有1人,不能使用group by limit
发表于 2024-09-02 15:40:25 回复(0)
select *
from employees
where hire_date=
(
select hire_date
from employees
order by hire_date desc
limit 1
)

发表于 2024-08-02 16:32:38 回复(0)
select * from employees where hire_date=(select hire_date from employees order by hire_date desc limit 1);
发表于 2024-07-24 14:11:19 回复(0)
select *
from employees
where hire_date=(
    select max(hire_date) from employees
)

发表于 2024-07-17 16:22:26 回复(0)
窗口函数方法:
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)