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

阅读(1233) 标签: 分组, 生成新序表, 循环, file, import, keys, switch, new, sum, for,

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  结果