LeetCode# 查找每个员工花费的总时间

158 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第39天,点击查看活动详情

一、题目

表: Employees

+-------------+------+
| Column Name | Type |
+-------------+------+
| emp_id      | int  |
| event_day   | date |
| in_time     | int  |
| out_time    | int  |
+-------------+------+

(emp_id, event_day, in_time) 是这个表的主键。
该表显示了员工在办公室的出入情况。
event_day 是此事件发生的日期,in_time 是员工进入办公室的时间,而 out_time 是他们离开办公室的时间。
in_time 和 out_time 的取值在11440之间。
题目保证同一天没有两个事件在时间上是相交的,并且保证 in_time 小于 out_time。

 

编写一个SQL查询以计算每位员工每天在办公室花费的总时间(以分钟为单位)。 请注意,在一天之内,同一员工是可以多次进入和离开办公室的。 在办公室里一次进出所花费的时间为out_time 减去 in_time。

返回结果表单的顺序无要求。 查询结果的格式如下:

Employees table:
+--------+------------+---------+----------+
| emp_id | event_day  | in_time | out_time |
+--------+------------+---------+----------+
| 1      | 2020-11-28 | 4       | 32       |
| 1      | 2020-11-28 | 55      | 200      |
| 1      | 2020-12-03 | 1       | 42       |
| 2      | 2020-11-28 | 3       | 33       |
| 2      | 2020-12-09 | 47      | 74       |
+--------+------------+---------+----------+
Result table:
+------------+--------+------------+
| day        | emp_id | total_time |
+------------+--------+------------+
| 2020-11-28 | 1      | 173        |
| 2020-11-28 | 2      | 30         |
| 2020-12-03 | 1      | 41         |
| 2020-12-09 | 2      | 27         |
+------------+--------+------------+

雇员 1 有三次进出: 有两次发生在 2020-11-28 花费的时间为 (32 - 4) + (200 - 55) = 173, 有一次发生在 2020-12-03 花费的时间为 (42 - 1) = 41。 雇员 2 有两次进出: 有一次发生在 2020-11-28 花费的时间为 (33 - 3) = 30, 有一次发生在 2020-12-09 花费的时间为 (74 - 47) = 27。

二、思路解析

创建数据表

根据题意创建数据表,并填充数据

CREATE TABLE IF NOT EXISTS Employees(
	emp_id INT,
	event_day DATE,
	in_time INT,
	out_time INT
);
INSERT INTO Employees VALUES
(1, '2020-11-28', 4, 32),
(1, '2020-11-28', 55, 200),
(1, '2020-12-3', 1, 42),
(2, '2020-11-28', 3, 33),
(2, '2020-12-9', 47, 74);

解题

  • 根据题意可以得本题是将用户id和日期为分组得数据集,将得到的数据集进一步处理,这里是使用group by emp_id,event_day
  • 得到新得数据集后,要进一步计算每位员工每天在办公室花费的总时间,这里比较容易计算直接使用SUM(out_time-in_time) total_time,同时将event_day DAY,emp_id 也输出出来
  • 执行语句得到结果
SELECT event_day DAY,emp_id,SUM(out_time-in_time) total_time
FROM Employees
GROUP BY emp_id,event_day;
  • 显示结果

image.png

三、执行语句

执行结果

image.png

四、总结

本题比较简单,第一个点就是以用户id和日期为分组,第二点 就是计算得方式,要使用sum(),这里比较并不需要使用Max或者min()。需要注意!