首页 > 解决方案 > 每 10 分钟查看一天的历史考勤数据

问题描述

我有一个包含学生出勤的表,架构是

StudentId   ClassId EventType   EventTime   
1           1       I           2018-10-31 07:00:00 AM
2           1       I           2018-10-31 07:02:00 AM
1           1       O           2018-10-31 07:31:00 AM
3           1       I           2018-10-31 07:45:00 AM

输出

ClassId     StudentCount    StartTime               EndTime
1           2               2018-10-31 07:00:00 AM  2018-10-31 07:10:00 AM
1           2               2018-10-31 07:10:01 AM  2018-10-31 07:20:00 AM
1           2               2018-10-31 07:20:01 AM  2018-10-31 07:30:00 AM
1           1               2018-10-31 07:30:01 AM  2018-10-31 07:40:00 AM
1           2               2018-10-31 07:40:01 AM  2018-10-31 07:50:00 AM

标签: sqltsqlsql-server-2016

解决方案


您需要生成时间。一种方法使用递归 CTE。然后有多种方法可以得到计数。

with times as (
      select cast('2018-10-31 07:00:00' as datetime) dt
      union all
      select dateadd(minute, 10, dt)
      from times
      where dateadd(minute, 10, dt) < '2018-10-31 08:00:00'
     )
select t.dt,
       (select sum(case when eventtype = 'I' then 1 else -1 end)
        from attendance a
        where a.EventTime <= t.dt
       ) as attendance
from times;

推荐阅读