在数据计算时,除了每条记录本身,经常也会关心有序集合中与位置相关的计算。例如:编号为 752084 的订单在销售表中的第几行?2019 年上证指数收盘价最高的是第几个交易日?如何简单快捷的实现定位?这里将为你全程剖析,并提供 esProc SPL 示例代码。有序集合上的定位计算
1. 定位成员
定位成员是指在有序集合中通过比较成员来查找位置。
【例 1】 下面任课教师表中,第一列是教师姓名,第二列是学科,后面是课程代码(null 表示空)。任课教师表部分数据如下:
课程表数据如下:
【SPL脚本】
A5的执行结果如下:
在集合中定位成员时,成员可能重复出现。例如定位数学 100 分的同学可能有多个,名字叫 Ashley 的员工可能不止一人等等。
【例 2】 根据销售表和客户表,查询 2014 年无销售记录的客户。销售表和客户表的关系如下:
【SPL 脚本】
A6的执行结果如下:
2. 定位最大值 / 最小值
定位最大值 / 最小值,是指获取最大值 / 最小值成员(或表达式)所在的序号。
【例 3】 根据股市交易表,统计上证指数收盘价最高的当天,相对前日的涨幅。部分数据如下:
【SPL 脚本】
A4的执行结果如下:
同样可以使用函数 A.pmin() 来取最小值的成员序号:
最大值所在记录不一定是唯一的,如果想返回所有记录的序号,可以使用函数 A.pmax() 的选项 @a :
如果希望从后向前定位,可以使用函数 A.pmax() 的选项 @z :
3. 根据条件定位
根据条件定位,是指对有序集合的成员按指定条件进行计算,返回结果为 "true" 的成员序号。例如在员工表中查找年龄大于 50 岁的员工序号,在成绩表中查找数学分数高于 90 分的成绩序号等等。
【例 4】 根据股市交易表,统计收盘价涨幅超过 3% 的交易日,相对前日的交易量涨幅。部分数据如下:
【SPL脚本】
A3的执行结果如下:
A4的执行结果如下:
我们可以看到,收盘价涨幅超过 3% 的这三天,交易量较前日大幅提升。
4. 区间定位
前面介绍了根据成员或者表达式来定位,有时候我们还需要通过区间定位,从而进行分组汇总等计算。例如年龄集合 [0,18,35,60] 分别代表少年、青年、中年和老年,查找年龄 20 在集合中的区段序号,结果是 2,也就是青年;工资集合定义为[0,8000,15000,30000],查找工资 25000 在集合中的区段序号,结果是 3。
【例 5】 根据员工薪资表,统计 8000 以下、8000~12000 和 12000 以上每个薪资分段的员工总数。部分数据如下:
【SPL脚本】
A5的执行结果如下:
有时候集合的区段值需要经过计算后再计算成员在集合中的区段序号。
【例 6】 根据员工薪资表,统计入职 10 年以下、10~20 年和 20 年以上每组的员工平均工资。部分数据如下:
【SPL 脚本】
A5的执行结果如下:
5. 获取排序后在原集合的位置
将有序集合的成员,通过一定的方法按关键字顺序排列的过程叫做排序。其目的是将一组“无序”的记录集合调整为“有序”的记录集合。有时候有序集合的原序是有意义的,例如查询出来的订单表是按时间顺序生成的,现在要按照销售额进行排序。但是时间顺序在后续的计算中还需要使用,希望按新条件排序的同时可以保留原序。
【例 7】 根据员工表,求年龄最大的三名员工的入职顺序。部分数据如下:
【SPL 脚本】
A4的执行结果如下:
6. 集合的整体定位
前面介绍了单个成员的定位运算,下面要介绍集合的整体定位。例如在集合 [a,b,c,d,e] 中定位集合 [c,d,a],返回结果为[3,4,1]。再比如在集合[a,b,c,d,e] 中定位集合[c,f],虽然 c 存在,但是 f 不存在,所以返回结果为空。
【例 8】 根据发帖记录表,按标签分组并统计各个标签出现频数。部分数据如下:
【SPL 脚本】
A5的执行结果如下:
7. 判断是否集合成员
有时候我们并不关心集合 B 的成员在集合 A 中的序号,只需要判断集合 A 中是否包含了集合 B 的所有成员。
【例 9】 根据各国官方语言表,查询官方语言同时包括中文和英文的国家。部分数据如下:
【SPL 脚本】
A5的执行结果如下:
8. 定位主键值
当需要定位的字段是主键时,可以特殊处理。
【例 10】 在相互关联的产品表和类别表中,查询产品类别未出现在类别表中的有哪些。产品表和类别表的关系如下:
【SPL 脚本】
A4的执行结果如下:
9. 定位前 N 名 / 后 N 名
定位前 N 名 / 后 N 名是比较常见的计算。例如查询班级数学前三名,查询入职时间最短的五名员工等等。这一节要来介绍如何获取前 N 名 / 后 N 名成员所在的序号。
【例 11】 根据股市交易表,统计上证指数 2019 年收盘价最高的三天,相对前日的涨幅。部分数据如下:
【SPL 脚本】
A3的执行结果如下:
A4的执行结果如下:
《SPL CookBook》中还有更多相关计算示例。
网友评论