在 New York 累计工作时间超过 5 年的员工

下面是某企业的员工信息表 Employees:

..

由于业务原因,该企业的员工存在着经常性的地区调动,为记录调动历史,他们使用了下面一个表 EmpTransfer,记录了员工从入职开始的每一次工作调动(已经离职的员工不在此表中):

..

每次调动事件的日期和目标地点都记录在其中。现在请从其中找出在 New York 的累计工作时间超过了 5 年的员工。

此问题的关键,在于把按调动事件记录的表的结构改造成按照工作时间段记录的表,接下来就可以轻易的计算各个阶段的工作时间并进行筛选了。


A

1

=T("Employees.txt").keys(ID)

2

=T("EmpTransfer.txt")

3

>A2.switch(Employee,A1)

4

=A2.group(Employee;~.sum(if(Area=="New York", ifn(Date[1],now())-Date)): AccWorkDays_NYC)

5

=A4.select(AccWorkDays_NYC>=5*365) .new(Employee.Name:Employee, AccWorkDays_NYC\365:AccWorkYears_NYC)

A1读出员工信息,A2 读出员工调动记录。

A3用 switch 将调度表中的员工字段都替换为员工表中相应的记录。SPL 中这样的处理经常给我们解决问题带来很大的便利。

A4将员工调动记录按员工分组,并在每组内循环计算这位员工在 New York 工作的总天数 AccWorkDays_NYC,为此对他的所有调动记录求和,累计他调动到 New York 的工作时间,每次起始时间即为对应的 Date,而终止时间为下一条调动记录的 Date,如果没有下一条记录则用 now 获得当前时间来作为终止时间。

A4结果如下:

..

A5在其中选出在 AccWorkDays_NYC 超过 5 年的员工,并整理出结果序表,从 Employee 字段中获取员工名字,并算他在 New York 工作的总年数:

..