寻找一种将连续时钟记录分组到单行中的方法。
源系统具有身份列、员工 ID、日期和输入/输出标志(1=输入 & 2=输出)。请注意,
ID EmployeeID DATE InOut
1019374 5890 2008-08-19 14:07:14 1
1019495 5890 2008-08-19 18:17:08 2
1019504 5890 2008-08-19 18:50:40 1
1019601 5890 2008-08-19 22:06:18 2
我正在寻找能给我以下结果的sql
EmployeeID ClockIn BreakStart BreakEnd ClockOut
5890 2008-08-19 14:07:14 2008-08-19 18:17:08 2008-08-19 18:50:40 2008-08-19 22:06:18
请注意,由于时钟编辑,源系统中的 ID 并不总是连续的。日期应该按时间顺序排列。如果只存在两拳,我将需要不间断地填充打卡上班和打卡下班日期(或者我可以使用案例语句提取的一致内容)。无中断示例如下:
EmployeeID ClockIn BreakStart BreakEnd ClockOut
5890 2008-08-19 14:07:14 2008-08-19 22:06:18
sql版本是2008 R2
提前致谢,我不知道如何让它持续工作,非常感谢您的帮助。
您可以使用ROW_NUMBER()
函数和窗口COUNT()
处理无休息日:
;with cte as (SELECT *,ROW_NUMBER() OVER(PARTITION BY EmployeeID, CAST(dt AS DATE) ORDER BY dt) RN
,COUNT(*) OVER(PARTITION BY EmployeeID, CAST(dt AS DATE)) Dt_CT
FROM Table1)
SELECT EmployeeID
,Dt = CAST(dt AS DATE)
,ClockIn = MAX(CASE WHEN RN = 1 THEN DT END)
,BreakStart = MAX(CASE WHEN Dt_CT = 4 AND RN = 2 THEN DT END)
,BreakEnd = MAX(CASE WHEN Dt_CT = 4 AND RN = 3 THEN DT END)
,ClockOut = MAX(CASE WHEN (Dt_CT = 2 AND RN = 2) OR RN = 4 THEN DT END)
FROM cte
GROUP BY EmployeeID
,CAST(dt AS DATE)
Demo: SQL小提琴 http://sqlfiddle.com/#!3/7b9443/1/0
这是按白天设置的,因此午夜后打卡是行不通的,并且奇数的打孔次数也会有问题,但对于像您的示例这样的简单世界来说,这是可行的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)