在SQL的单个记录中将两个记录分组

时间:2019-07-19 04:18:39

标签: sql sql-server

我有以下记录: 我想以以下方式检索记录:

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

有人可以帮忙实现每个插槽吗?

1 个答案:

答案 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;

Demo