SPL:分区段查找数据

   分区段查找数据,是指将数据按照指定的分段区间进行分组查询。比如根据考试成绩返回评价(优、良、中、差);根据家庭年收入返回家庭所处的资产等级(贫困、小康、中产、富裕等)。

1.  成员在序列中的区段序号

   我们首先定义用于分段的区间序列。比如定义年龄序列 [0,18,45,60],分别表示未成年、青年、中年及老年。接下来通过计算年龄字段的值在年龄区间序列中的序号,就可以知道这个人所处的年龄段了。

   SPL中提供了函数 A.pseg(),用于返回成员在序列中的区段序号,默认是左闭又开区间。比如 17 岁归属于 [0,18) 年龄段,函数 A.pseg()返回的序号是 1;而 18 岁归属于 [18,45) 年龄段,函数 A.pseg()返回的序号是 2。函数 A.pseg()提供了选项 @r,用于在计算区段序号时使用左开右闭区间。比如同样的例子,18 岁在使用函数 A.pseg@r()时,归属于 (0,18] 区间,返回的序号是 1。

   以员工为例,部分数据如下:

ID

NAME

ENTRYDATE

STATE

DEPT

SALARY

1

Rebecca

2005/03/11

California

R&D

7000

2

Ashley

2008/03/16

New   York

Finance

11000

3

Rachel

2010/12/01

New   Mexico

Sales

9000

4

Emily

2006/08/15

Texas

HR

7000

5

Ashley

2004/07/30

Texas

R&D

16000

 

【例 1】 根据工资将员工分为 8000 以下、8000-12000 和 12000 以上,并统计每组人数。

   SPL脚本如下:


A

1

=T("Employee.csv")

2

[0,8000,12000]

3

=A1.align@a(A2.len(),A2.pseg(SALARY))  

4

=A3.new(A2   (#):SALARY,~.count():COUNT)

A1:导入员工表数据。

A2:定义工资区间。

A3:使用函数 A.pseg() 获取工资所在区间序号。再根据工资序号进行对位分组。

A4:统计每组的人数。

 

【例 2】 根据入职时间将员工分为 1 到 10 年、10 年以上到 20 年以及 20 年以上三个区段,并统计每组的平均工资。

   SPL脚本如下:


A

1

=T("Employee.csv")

2

 [0,10,20]

3

=A1.align@a(A2.len(),A2.pseg@r(interval@y(ENTRYDATE,now())))

4

=A3.new(A2(#):EntryYears,~.avg(SALARY):AvgSalary)  

A1:导入员工表数据。

A2:定义工作年限区间。

A3:使用函数 A.pseg() 获取入职年限所在区间序号,其中选项 @r 表示左开右闭区间。再根据序号进行对位分组。

A4:统计每组的平均工资。

 

2.  根据区段序号返回序列中对应成员

   有时候我们需要通过计算字段值(或表达式)在区间中的序号,来获取在集合中的对应成员。

   SPL中提供了函数 A.segp(),用于根据区段序号返回序列中对应成员。

【例 3】 根据成绩表,统计英语科目优秀、及格和不及格的人数。部分数据如下:

Class

StudentID

Subject

Score

1

1

English

95

1

1

Math

90

1

1

PE

80

1

2

English

75

1

2

Math

84

 

   SPL脚本如下:


A

1

=T("Scores.csv").select(SUBJECT:"English")

2

=create(Assessment,Score).record(["Fail",0,"Pass",60,"Excellent",90])

3

=A1.derive(A2.segp(Score,SCORE).Assessment:Assessment)

4

=A3.groups(Assessment;count(1):Count)

A1:导入学生成绩表,并选出英语科目的数据。

A2:创建分数和评价对照表:

Assessment

Score

Fail

0

Pass

60

Excellent

90

A3:使用函数 A.segp() 根据分数在对照表中的区间序号,获取相应的评价。

A4:按评价分组统计人数。