一、问题描述
表: 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 的取值在1到1440之间。题目保证同一天没有两个事件在时间上是相交的,并且保证 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。
复制代码
考察
三、问题分析
这一题题目要求我们计算每个员工在办公室花费的总时间,注意每天相同的员工也是可以自由出入的,这里我们要根据event_day,emp_id进行聚合分组,对于分组之后的总时间如何计算呢?
总时间可以使用sum(out_time-in_time)这种方法直接计算结果,没有必要一行行判断了。
四、编码实现
select event_day as 'day',emp_id,sum(out_time-in_time ) as 'total_time'from Employeesgroup by event_day,emp_id
复制代码
五、测试结果
评论