题解 | 统计各岗位员工平均工作时长
题目要求拆解:
- 需要 岗位维度聚合计算平均工作时间
- 排序:按照平均工作时长降序排序
- 其他需要考虑:如员工未打卡该字段数据会存储为NULL,那么不计入在内
- 描述的不太清晰,准确理解应该是如果员工存在上班或者下班时没打卡的情况,则该员工及其工作时间不计入在内
思路分析:
- 初步分析,我们需要的post,first_clockin, last_clockin信息,分别存于staff_tb表和attendent_tb表中,我们要数据是有效数据,即以上3个信息都必须有值的数据,所以数据范围应该得即满足staff_tb表也满足于attendent_tb表,所以使用inner join。
- 数据表中的时间字段是精确到了秒级别,且我们需要统计的是到小时级别,因此可以使用TIMESTAMPDIFF (unit, start, end) 来计算上班时长。
- 这里有一个点需要注意:
- TIMESTAMPDIFF 函数是支持hour级别计算的,但是计算的结果是不会保留小数部分的。
- 如果想保留小数,可以用TIMESTAMPDIFF函数计算到minutes然后除以60进行换算。
- 因为题目中要求“如员工未打卡该字段数据会存储为NULL,那么不计入在内” ,所以需要使用where进行不符合数据的过滤,即 a.first_clockin is not null and a.last_clockin is not null
- Order by work_hours desc
select s.post, sum( ( TIMESTAMPDIFF (minute, a.first_clockin, a.last_clockin) / 60 ) ) / count(a.staff_id) as work_hours from staff_tb as s inner join attendent_tb as a on s.staff_id = a.staff_id where a.first_clockin is not null and a.last_clockin is not null group by s.post order by work_hours desc