考勤记录合并进出状态

【问题】

有门禁标
姓名   动作     时间
张三   进入   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

计算结果:

undefined