跳转至

3156. 员工任务持续时间和并发任务 🔒

题目描述

表:Tasks

+---------------+----------+
| Column Name   | Type     |
+---------------+----------+
| task_id       | int      |
| employee_id   | int      |
| start_time    | datetime |
| end_time      | datetime |
+---------------+----------+
(task_id, employee_id) 是这张表的主键。
这张表的每一行包含任务标识,员工标识和每个任务的开始和结束时间。

编写一个解决方案来查找 每个 员工的任务 总持续时间 以及员工在任何时间点处理的 最大并发任务数。总时长应该 舍入 到最近的 整小时

返回结果表以 employee_id 升序 排序。

结果格式如下所示。

 

示例:

输入:

Tasks 表:

+---------+-------------+---------------------+---------------------+
| task_id | employee_id | start_time          | end_time            |
+---------+-------------+---------------------+---------------------+
| 1       | 1001        | 2023-05-01 08:00:00 | 2023-05-01 09:00:00 |
| 2       | 1001        | 2023-05-01 08:30:00 | 2023-05-01 10:30:00 |
| 3       | 1001        | 2023-05-01 11:00:00 | 2023-05-01 12:00:00 |
| 7       | 1001        | 2023-05-01 13:00:00 | 2023-05-01 15:30:00 |
| 4       | 1002        | 2023-05-01 09:00:00 | 2023-05-01 10:00:00 |
| 5       | 1002        | 2023-05-01 09:30:00 | 2023-05-01 11:30:00 |
| 6       | 1003        | 2023-05-01 14:00:00 | 2023-05-01 16:00:00 |
+---------+-------------+---------------------+---------------------+

输出:

+-------------+------------------+----------------------+
| employee_id | total_task_hours | max_concurrent_tasks |
+-------------+------------------+----------------------+
| 1001        | 6                | 2                    |
| 1002        | 2                | 2                    |
| 1003        | 2                | 1                    |
+-------------+------------------+----------------------+

解释:

  • 对于员工 ID 1001:
    • 任务 1 和任务 2 从 08:30 到 09:00 重叠(30 分钟)。
    • 任务 7 持续时间为 150 分钟(2 小时 30 分钟)。
    • 总工作小时:60(任务 1)+ 120(任务 2)+ 60(任务 3)+ 150(任务 7)- 30(重叠)= 360 分钟 = 6 小时。
    • 最大并发任务:2 (重叠期间)。
  • 对于员工 ID 1002:
    • 任务 4 和任务 5 从 09:30 到 10:00 重叠(30 分钟)。
    • 总工作时间:60 (任务 4)+ 120(任务 5)- 30(重叠)= 150 分钟 = 2 小时 30 分钟。
    • 总工作小时:(舍入后):2 小时。
    • 最大并发任务:2 (重叠期间)。
  • 对于员工 ID 1003:
    • 没有重叠的工作。
    • 总工作时间:120 分钟 = 2 小时。
    • 最大并发任务:1。

注意:输出表以 employee_id 升序排序。

解法

方法一:合并 + 连接

我们首先将 employee_idstart_timeend_time 合并到一个新的表 T 中,然后使用 LEAD 函数计算出每个员工的下一个任务的开始时间,接着我们将 T 表和 Tasks 表连接起来,计算出每个员工的并发任务数,最后按照 employee_id 分组,计算出每个员工的总任务时间和最大并发任务数。

相似题目:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# Write your MySQL query statement below
WITH
    T AS (
        SELECT DISTINCT employee_id, start_time AS st
        FROM Tasks
        UNION DISTINCT
        SELECT DISTINCT employee_id, end_time AS st
        FROM Tasks
    ),
    P AS (
        SELECT
            *,
            LEAD(st) OVER (
                PARTITION BY employee_id
                ORDER BY st
            ) AS ed
        FROM T
    ),
    S AS (
        SELECT
            P.*,
            COUNT(1) AS concurrent_count
        FROM
            P
            INNER JOIN Tasks USING (employee_id)
        WHERE P.st >= Tasks.start_time AND P.ed <= Tasks.end_time
        GROUP BY 1, 2, 3
    )
SELECT
    employee_id,
    FLOOR(SUM(TIME_TO_SEC(TIMEDIFF(ed, st)) / 3600)) AS total_task_hours,
    MAX(concurrent_count) AS max_concurrent_tasks
FROM S
GROUP BY 1
ORDER BY 1;

评论