1.14 分组:组内筛选前 N 名 / 后 N 名
使用 group() 函数分组,将分组子集保留下来,再对分组子集进行聚合运算。这种运算方式的优点是分组子集可以保留下来,如果需要对分组子集重复使用,或者进行一些复杂的运算,可以采用此方式。
在成绩表中,查询各班每科成绩前两名的学生 ID。
CLASS | STUDENTID | SUBJECT | SCORE |
---|---|---|---|
Class one | 1 | English | 84 |
Class one | 1 | Math | 77 |
Class one | 1 | PE | 69 |
Class one | 2 | English | 81 |
Class one | 2 | Math | 80 |
… | … | … | … |
脚本:
A | |
---|---|
1 | =connect(“db”) |
2 | =A1.query@x(“select * from Scores”) |
3 | =A2.group(CLASS,SUBJECT;~.top(-2;SCORE):TOP2) |
4 | =A3.(TOP2).conj() |
A1 连接数据库
A2 查询学生成绩
A3 按班级和学科分组并取出每组分数前两名
A4 将所有班级各科前两名对应的记录合并
A3 返回结果(group 函数分组后产生每个组的子集,此时 topN 是一种聚合运算,对每个子集取前两名。):
CLASS | SUBJECT | Members |
---|---|---|
Class one | English | [[Class one,4,English,96],[Class one,9,English,93]] |
Class one | Math | [[Class one,13,Math,97],[Class one,10,Math,97]] |
… | … | … |
运行结果:
CLASS | STUDENTID | SUBJECT | SCORE |
---|---|---|---|
Class one | 4 | English | 96 |
Class one | 9 | English | 93 |
Class one | 13 | Math | 97 |
Class one | 10 | Math | 97 |
… | … | … | … |