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