SPL:按枚举条件分组
在分组时,我们经常需要把满足同一个条件的记录分配到同一组中。比如根据城市人口将城市分为大、中、小型城市,根据年收入将家庭分为富裕、中产、小康、贫困等等。根据事先定义好的枚举条件,将符合条件的成员分配到对应的组中,这种分组我们称为枚举分组。
1. 每个成员只存放到第一个匹配组
按事现定义好的一组枚举条件的顺序,将待分组集合的成员作为参数计算这批条件,条件成立者都被划分到与该条件对应的第一个匹配组中。
【例 1】 根据中国城市的市区人口,将城市分类并统计数量。其中超大城市 200 万人口以上,特大城市 100-200 万人口,大城市 50-100 万,其他中小城市。部分数据如下:
ID |
CITY |
POPULATION |
PROVINCE |
1 |
Shanghai |
12286274 |
Shanghai |
2 |
Beijing |
9931140 |
Beijing |
3 |
Chongqing |
7421420 |
Chongqing |
4 |
Guangzhou |
7240465 |
Guangdong |
5 |
Hong Kong |
7010000 |
Hong Kong Special Administrative Region |
… |
… |
… |
… |
在 SPL 中函数 A.enum() 用于枚举分组,默认每个成员只存放到第一个匹配组。
SPL脚本如下:
A |
|
1 |
=T("UrbanPopulation.txt") |
2 |
[?>2000000,?>1000000,?>500000,?<=500000] |
3 |
=A1.enum(A2,POPULATION) |
4 |
[超大城市, 特大城市, 大城市, 中小城市] |
5 |
=A3.new(A4(#):CITY_TYPE,~.count():COUNT) |
A1:导入城市人口表。
A2:定义分组条件。
A3:使用函数 A.enum() 将城市人口表按条件进行枚举分组,默认将每个成员只存放到第一个匹配组。
A4:定义每组的名称。
A5:根据枚举分组结果,统计每个组的城市数量。
2. 不匹配成员存放到新组
按枚举条件进行分组时,可能会有不匹配任何一组条件的成员,我们可以将这些成员存放到新组。适用于不仅关心匹配的成员信息,还要关心其他不匹配成员的场景。
【例 2】 根据年龄将员工分组统计平均工资,分成 35 岁以下、45 岁以下和其他三个组。员工表部分数据如下:
ID |
NAME |
BIRTHDAY |
STATE |
DEPT |
SALARY |
1 |
Rebecca |
1974/11/20 |
California |
R&D |
7000 |
2 |
Ashley |
1980/07/19 |
New York |
Finance |
11000 |
3 |
Rachel |
1970/12/17 |
New Mexico |
Sales |
9000 |
4 |
Emily |
1985/03/07 |
Texas |
HR |
7000 |
5 |
Ashley |
1975/05/13 |
Texas |
R&D |
16000 |
… |
… |
… |
… |
… |
… |
在 SPL 中函数 A.enum() 的选项 @n,用于在枚举分组时将不匹配成员存放到新组。
SPL脚本如下:
A |
|
1 |
=T("Employee.csv") |
2 |
[?<35,?<45] |
3 |
=A1.enum@n(A2, age(BIRTHDAY)) |
4 |
[35 岁以下,45 岁以下, 其他] |
5 |
=A3.new(A4(#):AGE_AREA,~.avg(SALARY):AVG_SALARY) |
A1:导入员工表。
A2:定义分组条件。
A3:使用函数 A.enum() 按年龄条件枚举分组,使用选项 @n 将不匹配成员存放到新组。
A4:定义每组的名称。
A5:根据枚举分组结果,统计每个员工的平均工资。
3. 按照枚举条件可重复分组
有时我们需要把满足多个分组条件的成员,重复分配到所有对应的分组中。
【例 3】 根据城市 GDP 表,分别统计直辖市、一线城市、二线城市的人均 GDP。需要注意的是,分组可能会有重复成员,比如北京既是一线城市,又是直辖市。部分数据如下:
ID |
CITY |
GDP |
POPULATION |
1 |
Shanghai |
32679 |
2418 |
2 |
Beijing |
30320 |
2171 |
3 |
Shenzhen |
24691 |
1253 |
4 |
Guangzhou |
23000 |
1450 |
5 |
Chongqing |
20363 |
3372 |
… |
… |
… |
… |
在 SPL 中函数 A.enum() 的选项 @r,用于在枚举分组时每组检查所有成员是否匹配。
SPL脚本如下:
A |
|
1 |
=T("CityGDP.txt") |
2 |
[["Beijing","Shanghai","Tianjin","Chongqing"],["Beijing","Shanghai","Guangzhou","Shenzhen"],["Chengdu","Hangzhou","Chongqing","Wuhan","Xian","Suzhou","Tianjin","Nanjing","Changsha","Zhengzhou","Dongguan","Qingdao","Shenyang","Ningbo","Kunming"]] |
3 |
[A2(1).pos(?)>0,A2(2).pos(?)>0,A2(3).pos(?)>0] |
4 |
=A1.enum@r(A3,CITY) |
5 |
[直辖市, 一线城市, 二线城市] |
6 |
=A4.new(A5(#):AREA,~.sum(GDP)/~.sum(POPULATION)*10000:CAPITA_GDP) |
A1:导入城市 GDP 表。
A2:定义直辖市、一线城市和二线城市常量。
A3:枚举直辖市、一线城市和二线城市的条件。
A4:使用函数 A.enum() 按枚举条件分组,使用选项 @r 时每组检查所有成员是否匹配。
A5:定义每组的名称。
A6:根据枚举分组结果,统计每组的人均 GDP。
好帖子,支持