考勤记录合并进出状态
【问题】
有门禁标
姓名 动作 时间
张三 进入 2015-05-13 9:00
张三 离开 2015-05-13 11:00
张三 进入 2015-05-13 12:00
张三 离开 2015-05-13 13:00
需要合并成
姓名 进入时间 离开时间
张三 2015-05-13 9:00 2015-05-13 11:00
张三 2015-05-13 12:00 2015-05-13 13:00
有可能出现没有离开记录 或者没有进入记录的数据
【回答】
这类序运算用SQL不好写,这个问题要考虑有缺失数据就更麻烦,简单用序号去对应的结果是错的。可以用SPL区间分组的方法去实现,具体如下:
A |
|
1 |
$select 姓名,动作,时间 from tb order by 姓名,时间 |
2 |
=a=0 |
3 |
=A1.group@o(姓名,a+=if(动作=="进入" || 动作[-1]=="离开",1,0)) |
4 |
=A3.new(姓名, (t=~.align(["进入","离开"],动作).(时间))(1):进入时间,t(2):离开时间) |
A1:执行SQL取数,按姓名,时间排序
A3:按姓名分组,再按当前动作和上一动作值分组,得到 进入-离开,对应的分组;
A4:根据A3创建新结果集,并将["进入","离开"]与每个分组对齐,取第一个时间为进入时间,第二个时间为离开时间,
假设数据为:
姓名 动作 时间
张三 进入 2015-05-13 09:00:00
张三 离开 2015-05-13 11:00:00
张三 进入 2015-05-13 12:00:00
张三 离开 2015-05-13 13:00:00
李四 进入 2015-05-13 09:00:00
李四 进入 2015-05-13 12:00:00
李四 离开 2015-05-13 13:00:00
李四 离开 2015-05-13 14:00:00
李四 进入 2015-05-13 15:00:00
王五 离开 2015-05-13 09:00:00
王五 进入 2015-05-13 11:00:00
王五 离开 2015-05-13 13:00:00
计算结果: