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:按评价分组统计人数。