取出各组的前N行数据是较常见的运算,好比:每一个月每种产品销量最高的五天是哪五天,每位员工涨薪最多的一次是哪次,高尔夫会员成绩最差的三次是哪三次,等等。在SQL中,这类运算要用窗口函数以及keep/top/rownumber等高级技巧来间接处理,代码难度较大。并且许多数据库(如MySQL)尚未这些高级功能,就只能用更复杂的JOIN语句和嵌套的子查询来实现了。若是还涉及多层分组,多级关联,计算过程会更加复杂。java
而在SPL中,因为top函数能够按行号、最大值、最小值等方式取分组中的前N行,所以解决此类问题更加容易、清晰。下面就用一个例子来讲明。数据库
数据库表golf存储着多位会员的高尔夫得分状况,部分数据以下:ide
ID | USER_ID | SCORE | DATETIME |
1 | 1 | 35 | 2014-07-01 11:00:00 |
2 | 1 | 17 | 2014-07-01 12:00:00 |
3 | 2 | 36 | 2014-07-01 11:00:00 |
4 | 2 | 27 | 2014-07-01 12:00:00 |
5 | 1 | 66 | 2014-07-02 11:00:00 |
6 | 1 | 77 | 2014-07-02 12:00:00 |
7 | 2 | 93 | 2014-07-02 12:00:00 |
8 | 1 | 27 | 2014-07-03 12:00:00 |
9 | 1 | 48 | 2014-07-03 18:00:00 |
10 | 1 | 36 | 2014-07-04 18:00:00 |
11 | 3 | 77 | 2014-07-01 12:00:00 |
12 | 3 | 68 | 2014-07-02 13:00:00 |
13 | 4 | 25 | 2014-07-02 13:00:00 |
请取出每位会员成绩最好的三次得分状况。函数
SPL代码:工具
A | |
1 | =db.query("select * from golf") |
2 | =A1.group(USER_ID) |
3 | =A2.(~.top(-3;SCORE)) |
4 | =A3.union() |
5 | >file("golf.csv").export@ct(A4) |
A1:从数据库取数。点击该单元格,能够看到取数结果:3d
A2:=A1.group(USER_ID)。将A1的结果按照USER_ID,也就是会员分组,结果以下:excel
每行表明一组,其中是一个会员的全部得分记录,双击浅蓝色格子,能够看到组内成员,以下:blog
A3:= A2.(~.top(-3;SCORE))。计算出每组数据SCORE字段前三的记录。这里的“~”表示每组数据,~.top()表示依次对每组数据应用函数top。函数top能够取得数据集的前N条记录,好比top(3;SCORE)表示按SCORE升序排列,取前3条(即最小值);top(-3;SCORE)表示按降序排列,取前3条(即最大值,也就是这里的最好成绩)。这一步的计算结果以下:接口
A4:=A3.union()。将各组数据合并,结果以下:文档
A5:>file("golf.csv").export@ct(A4)
将计算结果导出到" golf.csv "文件,以便经过excel等工具查看:
除了导出数据, SPL还能够直接被报表工具或java程序调用,调用方法和普通数据库类似,使用它提供的JDBC接口便可向java主程序返回ResultSet形式的计算结果,具体方法可参考相关文档。【Java如何调用SPL脚本】