6.5 对齐分组:每组保留所有匹配成员

 

按基准表中指定字段的顺序,将数据分组,每组保留所有匹配成员。适用于关心每组的成员信息,或者需要用这些成员记录继续进行统计的场景。

【例 1】 根据相互关联的员工表和部门表,按部门表中的部门顺序统计各部门人数。员工表和部门表的关系如下:

EMPLOYEE
ID
NAME
DEPT
STATE
DEPARTMENT
NAME
MANAGER

在 SPL 中函数 A.align() 的选项 @a,用于在对齐分组时每组保留所有匹配成员。

脚本:

A
1 =connect(“db”)
2 =A1.query(“select * from EMPLOYEE”)
3 =A1.query@x(“select * from DEPARTMENT”)
4 =A2.align@a(A3:DEPT, DEPT)
5 =A3.new(DEPT, A4(#).count():COUNT)

A1:连接数据库。
A2:查询员工表。
A3:查询部门表。
A4:使用函数A.align@a ()将员工按部门对齐分组,其中选项@a 每组返回所有匹配成员。
A5:根据部门表创建结果序列,并通过 A4 对齐分组后的结果计算每组的数量,即每个部门的人数。

运行结果:

DEPT COUNT
Administration 4
Finance 24
HR 19

对齐分组可能会有空组,也就是没有一个成员被分配到某个分组中。

【例 2】 根据相互关联的课程表和选课表,按课程表顺序查询各课程报名的人数。课程表与选课表的关系如下:

SelectCourse
ID
CourseID
StudentID
Course
ID
Name
TeacherID

脚本:

A
1 =connect(“db”)
2 =A1.query(“select * from SELECT_COURSE”)
3 =A1.query@x(“select * from COURSE”)
4 =A2.align@a(A3:ID,COURSEID)
5 =A3.new(ID, A4(#).len():COUNT)

A1:连接数据库。
A2:查询选课表。
A3:查询课程表。
A4:使用函数A.align@a (),将选课表按照课程表的ID对齐,每组保留所有匹配成员。
对齐分组后的结果中可能会有空组,也就是有的课程没有学生选择:

成员
[]
[[13,2,7],[15,2,50],…]
[[7,3,41],[11,3,5],…]
[[45,4,28],[51,4,18],…]
[[3,5,52],[4,5,44],…]

A5:根据课程表创建结果序列,并通过 A4 对齐分组后的结果计算每组的数量,即选择该课程的人数。

运行结果:

ID COUNT
1 0
2 6
3 5
4 4
5 11