-- 逻辑拆解:分组依据-按岗位,结果-计算平均时长
-- 难点:这个题目其实不简单,有几个问题需要想明白,难点1:题目要求每个岗位的平均时长,很容联想到岗位总的时长除以岗位人数,这里有问题,如果一个员工打卡多次,按照岗位分组求和时是没有办法知道该取哪条记录的,所以应该是该岗位每个员工的打卡时长求和再除以人数。
-- 难点2:对于AVG函数的使用,题目要求未打卡不计算人次,那么直接avg即可,有的人可能想用COALESCE把null变成空,如果这样那么avg是要计算分母的
SELECT
a.post,
AVG(a.work_hours) / 60 work_hours
FROM(
SELECT
t1.post,
t1.staff_id,
SUM(timestampdiff(minute,t2.first_clockin,t2.last_clockin)) work_hours
FROM staff_tb t1
INNER JOIN attendent_tb t2
ON t1.staff_id = t2.staff_id
GROUP BY t1.post,t1.staff_id
) a
GROUP BY a.post
ORDER BY work_hours DESC