列表

详情


2394. 开除员工

表: Employees

+--------------+------+
| Column Name  | Type |
+--------------+------+
| employee_id  | int  |
| needed_hours | int  |
+--------------+------+
employee_id 是该表具有的唯一值的列。
每一行都包含员工的 id 和他们获得工资所需的最低工作时数。

 

表: Logs

+-------------+----------+
| Column Name | Type     |
+-------------+----------+
| employee_id | int      |
| in_time     | datetime |
| out_time    | datetime |
+-------------+----------+
(employee_id, in_time, out_time) 是该表的主键(具有唯一值的列的组合)。
该表的每一行都显示了员工的时间戳。in_time 是员工开始工作的时间,out_time 是员工结束工作的时间。
所有时间都在 2022 年 10 月。out_time 可以是 in_time 之后的一天,这意味着该员工在午夜之后工作。

 

在公司里,每个员工每个月必须工作一定的小时数。员工在工作段中工作。员工工作的小时数可以通过员工在所有工作段中工作的分钟数的总和来计算。每个工作段的分钟数是向上取整的。

编写解决方案来报告将被开除的员工的 id。换句话说,报告没有工作所需时间的员工的 id。

任意顺序 返回结果表。

结果格式如下所示。

 

示例 1:

输入: 
Employees 表:
+-------------+--------------+
| employee_id | needed_hours |
+-------------+--------------+
| 1           | 20           |
| 2           | 12           |
| 3           | 2            |
+-------------+--------------+
Logs 表:
+-------------+---------------------+---------------------+
| employee_id | in_time             | out_time            |
+-------------+---------------------+---------------------+
| 1           | 2022-10-01 09:00:00 | 2022-10-01 17:00:00 |
| 1           | 2022-10-06 09:05:04 | 2022-10-06 17:09:03 |
| 1           | 2022-10-12 23:00:00 | 2022-10-13 03:00:01 |
| 2           | 2022-10-29 12:00:00 | 2022-10-29 23:58:58 |
+-------------+---------------------+---------------------+
输出: 
+-------------+
| employee_id |
+-------------+
| 2           |
| 3           |
+-------------+
解释: 
员工 1:
 - 参加了三个工作段:
    - 在 2022-10-01, 他工作了 8 个小时。
    - 在 2022-10-06, 他工作了 8 小时 4 分钟。
    - 在 2022-10-12, 他工作了 4 小时 1 分钟。请注意,他一直工作到午夜。
 - 员工 1 在各个时段总共工作了 20 小时5分钟,不被开除。
员工 2:
 - 参加了一个工作段:
    - 在 2022-10-29, 他工作了 11 小时 59 分钟。
 - 员工 2 没有工作足够的时长,将被开除。
员工 3:
 - 没有任何工作段。
 - 员工 3 没有工作足够的时长,将被开除。

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
# Write your MySQL query statement below

mysql 解法, 执行用时: 800 ms, 内存消耗: 0 B, 提交时间: 2023-10-15 23:12:42

# Write your MySQL query statement below
with t as (
    select
        employee_id,
        ceil(timestampdiff(second, in_time, out_time) / 60) as tot_time
    from
        Logs
)

select
    e.employee_id
from
    Employees as e
left join
    t
on
    e.employee_id = t.employee_id
group by
    e.employee_id
having
    sum(t.tot_time) is null
    or
    sum(t.tot_time) < max(e.needed_hours) * 60

上一题