取出各組的前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腳本】