如何在sql中查找每个员工从开始日期起的总工作时间?

问题描述

公司在3列的表格中记录员工进出办公室的情况 (Employee id,Action (In/Out),Created)

每位员工的第一个条目是“ In”。 每个“ In”都由“ Out”代替。没有数据缺口,员工可以跨天工作。

Employee id  Action  Created
1             In    2019-04-01 12:00:00
1             Out   2019-04-01 15:00:00
1             In    2019-04-01 17:00:00
1             Out   2019-04-01 21:00:00   

问题是要衡量每位员工自上任之日起在办公室内所花费的时间(如果正在工作,请考虑当前的工作时间)。您能帮助解决这个问题吗?

解决方法

这是一个空白和孤岛问题,最简单的方法之一是行号方法的区别。假设您正在使用支持分析功能的MySQL 8+,这是执行此操作的一种方法:

WITH cte AS (
    SELECT *,ROW_NUMBER() OVER (PARTITION BY EmployeeId,Action
                                 ORDER BY Created) rn
    FROM yourTable
),cte2 AS (
    SELECT EmployeeId,rn,TIMESTAMPDIFF(HOUR,MAX(CASE WHEN Action = 'In' THEN Created END),MAX(CASE WHEN Action = 'Out' THEN Created END)) AS num_hours
    FROM cte
    GROUP BY EmployeeId,rn
)

SELECT EmployeeId,SUM(num_hours) AS total_num_hours
FROM cte2
GROUP BY EmployeeId;

Demo

这里的方法首先为每个员工计算每个进/出间隔对中花费的小时数。然后由员工进行第二次汇总以获得总计。

,

您可以使用lead(),然后进行汇总:

select employeeid,sum(timestampdiff(hour,created,next_created) as num_hours
from (select t.*,lead(created) over (partition by employeeid order by created) as next_created
      from t
     ) t
where action = 'In'
group by employeeid;

我会提醒您,这是假设“输入”和“输出”是完全交替的。对于现实世界的数据,这不太可能是正确的。

如果您的数据不正确,您应该在此处接受答案之一,并提出一个 new 问题,其中包含更好的示例数据以及有关如何处理异常的更多解释。