我有以下记录: 我想以以下方式检索记录:
Jonh | 2019-07-17 07:19:24.00 | 2019-07-17 08:15:24.00 | 55
我想为员工获取每个相邻的出入点,并计算每个时段的工作时间。
ID |Name |IO |TimeIn |TimeOut | Hours Worked
-----------------------------------------------------------------------------------
11 |Jonh |0 |2019-07-17 07:19:24.000 | |
11 |Jonh |1 | |2019-07-17 08:15:24.000 |
11 |Jonh |0 |2019-07-17 08:39:42.000 | |
11 |Jonh |1 | | 2019-07-17 17:25:22.000|
我在这里所做的只是先入先出:
select id_emp, name, date,
min(case when inorout = 0 then timecol end) as timein,
max(case when inorout = 1 then timecol end) as timeout
from t
group by id_emp, name, date
有人可以帮忙实现每个插槽吗?
答案 0 :(得分:2)
假设您的数据行为合理,并且每个签入时间始终会有一个结帐时间,那么我们可以借助ROW_NUMBER
进行简单的聚合查询:
WITH cte AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY ID, Name, IO
ORDER BY COALESCE(TimeIn, TimeOut)) rn
FROM yourTable
)
SELECT
ID,
Name,
MAX(CASE WHEN IO = 0 THEN TimeIn END) AS TimeIn,
MAX(CASE WHEN IO = 1 THEN TimeOut END) AS TimeOut,
DATEDIFF(minute,
MAX(CASE WHEN IO = 0 THEN TimeIn END),
MAX(CASE WHEN IO = 1 THEN TimeOut END)) AS diff_in_minutes
FROM cte
GROUP BY
ID,
Name,
rn
ORDER BY
ID,
Name;