在 New York 累计工作时间超过 5 年的员工
问题
下面是某企业的员工信息表:
由于业务原因,该企业的员工存在着经常性的地区调动,为记录调动历史,他们使用了下面一个表,记录了员工从入职开始的每一次工作调动(已经离职的员工不在此表中):
每次调动事件的日期和目标地点都记录在其中。现在请从其中找出在 New York 的累计工作时间超过了 5 年的员工。
思路
大致思路:此问题的关键,在于把按调动事件记录的表的结构改造成按照工作时间段记录的表,接下来就可以轻易的计算各个阶段的工作时间并进行筛选了。
-
首先将调度表中的雇员字段都替换为雇员表中相应的记录。这个习惯经常给我们解决问题带来很大的便利。
-
将调度表按雇员分组,生成新序表,并预留出一个 New York 累计工作时间的字段,以便后面记录雇员在 New York 的累计工作时间。
-
循环每个组,即每个雇员。
-
通过雇员的调度记录组,创建新的序表,包含起始日期、结束日期和工作地点字段,起始日期写当前调动记录的时间,结束日期写下一条记录的时间,最后一条记录则写当前时间,工作地点填写当前记录的调动地点。这样我们就得到了一个按时间段记录的工作历史表。
-
选出其中在 New York 工作的时间段,求出其天数总和,写入 New York 累计工作时间字段。
-
循环结束后,直接选出 New York 工作时间大于等于 5 年天数的记录即可。
-
为查看方便,可以生成新序表,只包含雇员姓名和 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) | 更改格式,使其更直观 |
英文版
数据文件
Employees.txt
EmpTransfer.txt .