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

 

问题

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

imagepng

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

imagepng

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

思路

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

  1. 首先将调度表中的雇员字段都替换为雇员表中相应的记录。这个习惯经常给我们解决问题带来很大的便利。

  2. 将调度表按雇员分组,生成新序表,并预留出一个 New York 累计工作时间的字段,以便后面记录雇员在 New York 的累计工作时间。

  3. 循环每个组,即每个雇员。

  4. 通过雇员的调度记录组,创建新的序表,包含起始日期、结束日期和工作地点字段,起始日期写当前调动记录的时间,结束日期写下一条记录的时间,最后一条记录则写当前时间,工作地点填写当前记录的调动地点。这样我们就得到了一个按时间段记录的工作历史表。

  5. 选出其中在 New York 工作的时间段,求出其天数总和,写入 New York 累计工作时间字段。

  6. 循环结束后,直接选出 New York 工作时间大于等于 5 年天数的记录即可。

  7. 为查看方便,可以生成新序表,只包含雇员姓名和 New York 累计工作时间字段。

代码

A B
1 =file("C:\\txt\\Employees.txt").import@t() 雇员表
2 =file("C:\\txt\\EmpTransfer.txt").import@t().sort(Date) 雇员调度表
3 >A1.keys(ID), A2.switch(Employee,A1) 先将调度表中的雇员字段替换为记录
4 =A2.group(Employee;~:g,0: AccWorkDays_NYC) 按雇员分组,并预留工作时间字段
5 for A4 =A5.g 循环每个雇员
6 =B5.new(~.Date:StartDate, if(#==B5.len(),now(),B5(#+1).Date):EndDate, Area:WorkArea) 将表改为时间段的方式显示,最后一条记录用当前时间作为结束时间
7 =B6.select(WorkArea=="New York") 选出雇员在 New York 工作的时间段
8 >A5.AccWorkDays_NYC=B7.sum(interval(StartDate,EndDate)) 求总时间天数,并写入预留的字段内
9 =A4.select(AccWorkDays_NYC>=5*365) 选出 New York 累计工作时间超过 5 年的雇员
10 =A9.new(Employee.Name:Employee, int(AccWorkDays_NYC/ 365):AccWorkYears_NYC) 更改格式,使其更直观

结果

imagepng