溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

SPL 簡(jiǎn)化 SQL 案例詳解:計(jì)算各組前 N 行

發(fā)布時(shí)間:2020-07-12 05:19:10 來(lái)源:網(wǎng)絡(luò) 閱讀:170 作者:raqsoft 欄目:大數(shù)據(jù)

取出各組的前N行數(shù)據(jù)是較常見(jiàn)的運(yùn)算,比如:每個(gè)月每種產(chǎn)品銷量最高的五天是哪五天,每位員工漲薪最多的一次是哪次,高爾夫會(huì)員成績(jī)最差的三次是哪三次,等等。在SQL中,這類運(yùn)算要用窗口函數(shù)以及keep/top/rownumber等高級(jí)技巧來(lái)間接處理,代碼難度較大。而且許多數(shù)據(jù)庫(kù)(如MySQL)還沒(méi)有這些高級(jí)功能,就只能用更復(fù)雜的JOIN語(yǔ)句和嵌套的子查詢來(lái)實(shí)現(xiàn)了。如果還涉及多層分組,多級(jí)關(guān)聯(lián),計(jì)算過(guò)程會(huì)更加復(fù)雜。

而在SPL中,由于top函數(shù)可以按行號(hào)、最大值、最小值等方式取分組中的前N行,因此解決此類問(wèn)題更加容易、清晰。下面就用一個(gè)例子來(lái)說(shuō)明。

數(shù)據(jù)庫(kù)表golf存儲(chǔ)著多位會(huì)員的高爾夫得分情況,部分?jǐn)?shù)據(jù)如下:

IDUSER_IDSCOREDATETIME
11352014-07-01 11:00:00
21172014-07-01 12:00:00
32362014-07-01 11:00:00
42272014-07-01 12:00:00
51662014-07-02 11:00:00
61772014-07-02 12:00:00
72932014-07-02 12:00:00
81272014-07-03 12:00:00
91482014-07-03 18:00:00
101362014-07-04 18:00:00
113772014-07-01 12:00:00
123682014-07-02 13:00:00
134252014-07-02 13:00:00

請(qǐng)取出每位會(huì)員成績(jī)最好的三次得分情況。

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:從數(shù)據(jù)庫(kù)取數(shù)。點(diǎn)擊該單元格,可以看到取數(shù)結(jié)果:

SPL 簡(jiǎn)化 SQL 案例詳解:計(jì)算各組前 N 行

A2:=A1.group(USER_ID)。將A1的結(jié)果按照USER_ID,也就是會(huì)員分組,結(jié)果如下:

SPL 簡(jiǎn)化 SQL 案例詳解:計(jì)算各組前 N 行

每行代表一組,其中是一個(gè)會(huì)員的所有得分記錄,雙擊淺藍(lán)色格子,可以看到組內(nèi)成員,如下:

SPL 簡(jiǎn)化 SQL 案例詳解:計(jì)算各組前 N 行

A3:= A2.(~.top(-3;SCORE))。計(jì)算出每組數(shù)據(jù)SCORE字段前三的記錄。這里的“~”表示每組數(shù)據(jù),~.top()表示依次對(duì)每組數(shù)據(jù)應(yīng)用函數(shù)top。函數(shù)top可以取得數(shù)據(jù)集的前N條記錄,比如top(3;SCORE)表示按SCORE升序排列,取前3條(即最小值);top(-3;SCORE)表示按降序排列,取前3條(即最大值,也就是這里的最好成績(jī))。這一步的計(jì)算結(jié)果如下:

SPL 簡(jiǎn)化 SQL 案例詳解:計(jì)算各組前 N 行

A4:=A3.union()。將各組數(shù)據(jù)合并,結(jié)果如下:

SPL 簡(jiǎn)化 SQL 案例詳解:計(jì)算各組前 N 行

A5:>file("golf.csv").export@ct(A4)

將計(jì)算結(jié)果導(dǎo)出到" golf.csv "文件,以便通過(guò)excel等工具查看:

SPL 簡(jiǎn)化 SQL 案例詳解:計(jì)算各組前 N 行

除了導(dǎo)出數(shù)據(jù), SPL還可以直接被報(bào)表工具或java程序調(diào)用,調(diào)用方法和普通數(shù)據(jù)庫(kù)相似,使用它提供的JDBC接口即可向java主程序返回ResultSet形式的計(jì)算結(jié)果,具體方法可參考相關(guān)文檔。【Java如何調(diào)用SPL腳本】


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI