如何解决如何在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 问题,其中包含更好的示例数据以及有关如何处理异常的更多解释。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。