返回介绍

solution / 2300-2399 / 2394.Employees With Deductions / README

发布于 2024-06-17 01:03:06 字数 2901 浏览 0 评论 0 收藏 0

2394. 开除员工

English Version

题目描述

表: 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 之后的一天,这意味着该员工在午夜之后工作。

 

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

  • 例如,如果员工在一个时间段中工作了 512 秒,我们就认为它是 52 分钟。

编写解决方案来报告将被开除的员工的 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
WITH
  T AS (
    SELECT
      employee_id,
      SUM(ceiling(TIMESTAMPDIFF(second, in_time, out_time) / 60)) / 60 AS tot
    FROM Logs
    GROUP BY employee_id
  )
SELECT employee_id
FROM
  Employees
  LEFT JOIN T USING (employee_id)
WHERE IFNULL(tot, 0) < needed_hours;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文