sql - 查询以从多个打孔中派生计划
问题描述
我无法为每位员工构建一个每天只有一个时间表的查询。我正在处理的数据记录了每次打卡时间和每次打卡时间。我使用的查询工作正常,直到我遇到跨越一夜的时间表。下面是我使用的查询和一些示例数据。
SELECT EMPLOYEEID
,min(PUNCHIN) AS PUNCHIN
,max(PUNCHOUT) AS PUNCHOUT
FROM EMPSCHED
WHERE PUNCHIN <> PUNCHOUT
GROUP BY EMPLOYEEID
,CAST(PUNCHIN AS DATE)
order by EMPID, PUNCHIN
样品表:
EMPLOYEEID PUNCHIN PUNCHOUT
DGHAG 2020-07-10 20:00:00.000 2020-07-11 01:45:00.000
DGHAG 2020-07-11 01:45:00.000 2020-07-11 02:15:00.000
DGHAG 2020-07-11 02:15:00.000 2020-07-11 06:30:00.000
DGHAG 2020-07-11 06:30:00.000 2020-07-11 06:30:00.000
DGHAG 2020-07-11 20:00:00.000 2020-07-11 23:30:00.000
DGHAG 2020-07-11 23:30:00.000 2020-07-12 00:00:00.000
DGHAG 2020-07-12 00:00:00.000 2020-07-12 06:30:00.000
DGHAG 2020-07-12 06:30:00.000 2020-07-12 06:30:00.000
DGHAG 2020-07-12 20:00:00.000 2020-07-13 02:15:00.000
DGHAG 2020-07-13 02:15:00.000 2020-07-13 02:45:00.000
DGHAG 2020-07-13 02:45:00.000 2020-07-13 06:30:00.000
DGHAG 2020-07-13 06:30:00.000 2020-07-13 06:30:00.000
DGHFA 2020-07-08 08:30:00.000 2020-07-08 13:30:00.000
DGHFA 2020-07-08 13:30:00.000 2020-07-08 13:30:00.000
DGHFA 2020-07-09 08:30:00.000 2020-07-09 13:30:00.000
DGHFA 2020-07-09 13:30:00.000 2020-07-09 13:30:00.000
DGHFA 2020-07-11 08:30:00.000 2020-07-11 13:30:00.000
DGHFA 2020-07-11 13:30:00.000 2020-07-11 13:30:00.000
目标是为每个班次创建一个记录,将日程安排到一天的第一次打卡到班次的最后一次打卡,无论是同一天还是下一天。
创建表代码:
CREATE TABLE [dbo].[EMPSCHED](
[EMPLOYEEID] [nvarchar](50) NULL,
[PUNCHIN] [datetime] NULL,
[PUNCHOUT] [datetime] NULL
)
解决方案
以下查询将检测计划中的所有间隙(休息或轮班结束),而不管轮班的长度(它可以跨越多天)。
WITH CTE AS (
SELECT
EMPLOYEEID
,LAG(PUNCHOUT) OVER (PARTITION BY EMPLOYEEID ORDER BY PUNCHIN ASC) as last_punchout
,PUNCHIN
,PUNCHOUT
,LEAD(PUNCHIN) OVER (PARTITION BY EMPLOYEEID ORDER BY PUNCHIN ASC) as next_punchin
FROM EMPSCHED
WHERE PUNCHIN <> PUNCHOUT
)
SELECT
EMPLOYEEID
,PUNCHIN
,PUNCHOUT
FROM CTE
WHERE last_punchout <> PUNCHIN
OR PUNCHOUT <> next_punchin
OR last_punchout is null
OR next_punchin is null
你可以在这里玩它:https ://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=b651d6614d14ccec2f8da4d63f5f6a2f
推荐阅读
- powershell-4.0 - 从 AD 导入变量以映射驱动器
- c# - 为 RoleManager 和 UserManager 创建实例以进行单元测试?
- python - 由 findFundamentalMat() 和 stereoCalibrate() 计算的不同基本矩阵
- c++ - 带有 GStreamer 安装问题的 Yocto OpenCV
- spring - 请求方法 'PUT' 不支持] 重定向到另一个端点时
- javascript - Find all the same numbers in the array
- powershell - Why can't I use the same Get-Date variable twice without getting incorrect time
- c++ - error: static assertion failed: std::thread arguments must be invocable after conversion to rvalues
- angular - 离子图标没有出现
- r - How do I use safely with coxph and subset or weights?