我有一个文件,其中包含所有的时间打卡班次为每个员工这样:
| 雇员|开始时间|结束时间|
| - ------|- ------|- ------|
| 一百二十三|2022年10月23日10时40分00秒|2022年10月23日14时00分|
| 一百二十三|2022年10月23日14时00分|2022年10月23日14时30分|
| 一百二十三|2022年10月23日14时35分00秒|2022年10月23日17时7分00秒|
| 五百四十一|2022年10月23日06时50分00秒|2022年10月23日12时00分00秒|
| 五百四十一|2022年10月23日13时00分|2022年10月23日15时30分|
但是,如果上班时间和下班时间在重叠的时间段内,我希望返回每个员工的汇总行,如下所示
| 雇员|开始时间|结束时间|
| - ------|- ------|- ------|
| 一百二十三|2022年10月23日10时40分00秒|2022年10月23日17时7分00秒|
| 五百四十一|2022年10月23日06时50分00秒|2022年10月23日12时00分00秒|
| 五百四十一|2022年10月23日13时00分|2022年10月23日15时30分|
我之所以要这样做,是因为接下来我将对在给定时间段内属于时移的员工进行计数。现在我的查询是对重复员工进行计数,因为存在在同一小时内打卡下班和打卡上班的员工。
这是我计算每小时雇员人数的代码
WITH Hours AS(
SELECT 1 AS HOUR
UNION ALL
SELECT HOUR + 1 FROM Hours WHERE HOUR < 24
)
SELECT
CAST(Start_Time AS DATE) [DATE],
HOUR,
COUNT(Emp_Int) AS [Head Count]
FROM
Hours
LEFT JOIN
TIME_SHIFTS_TABLE T on HOUR BETWEEN DATEPART(HOUR, START_TIME) AND DATEPART(HOUR, END_TIME)
GROUP BY
CAST(Start_Time AS DATE), HOUR
ORDER BY
CAST(Start_Time AS DATE), HOUR asc
这个连接可以工作,但是当员工在同一小时内注销并重新登录时,它会计算重复的次数。
1条答案
按热度按时间aamkag611#
这是一个"空白和孤岛"问题。处理这类任务的一种方法是
MIN(start_time)
和MAX(end_time)
的聚合。您可以通过以下方式计算累计金额:
DATEDIFF
检查当前开始时间和先前结束时间之间的差值何时大于59分钟,因此如果是这种情况,则使用1标记SUM
窗口函数,用于您的每个员工然后,您可以在新创建的分区上运行聚合。
检查here演示。