溫馨提示×

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

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

SPL 簡(jiǎn)化 SQL 案例詳解:行間計(jì)算

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

在數(shù)據(jù)庫(kù)應(yīng)用開發(fā)中,我們經(jīng)常需要面對(duì)復(fù)雜的SQL計(jì)算,行間計(jì)算就是其中一種。比如:用每月的銷售額除以上月的銷售額,求比上期,或用每月銷售額除以去年同月的銷售額,求同期比。有些數(shù)據(jù)庫(kù)系統(tǒng)沒有提供SQL2003標(biāo)準(zhǔn)的窗口函數(shù),或者支持得不完備,那么完成行間計(jì)算就需要改變思路,使用連接(join)運(yùn)算替代,不僅難以理解而且運(yùn)算效率低下。即使可以使用窗口函數(shù),計(jì)算時(shí)仍要面臨嵌套子查詢等問(wèn)題,SQL語(yǔ)句仍舊復(fù)雜、冗長(zhǎng)。而SPL則可以通過(guò)更簡(jiǎn)單、直觀的代碼來(lái)實(shí)現(xiàn)行間計(jì)算,下面就用一個(gè)例子來(lái)說(shuō)明。

?????? 表sales存儲(chǔ)著多年的訂單數(shù)據(jù),部分?jǐn)?shù)據(jù)如下:

OrderIDClientSellerIdOrderDateAmount
10248VINET52013/7/42440
10249TOMSP62013/7/51863.4
10250HANAR42013/7/81813
10251VICTE32013/7/8670.8
10252SUPRD42013/7/93730
10253HANAR32013/7/101444.8
10254CHOPS52013/7/11625.2
10255RICSU92013/7/122490.5
10256WELLI32013/7/15517.8

現(xiàn)在要求根據(jù)該表計(jì)算出指定時(shí)間段內(nèi)各月份銷售額的比上期和同期比。

SPL代碼:


A
1=db.query("select * from sales where ? ORDERDATE>=? and ORDERDATE<=?",begin,end)
2=A1.groups(year(ORDERDATE):y,month(ORDERDATE):m;sum(AMOUNT):mAmount)
3=A2.derive(mAmount/mAmount[-1]:lrr)
4=A3.derive(mAmount/mAmount[-12]:yoy)
5=A4.sort(y:-1,m)
6>file("sales.csv").export@ct(A5)

A1:按時(shí)間段從數(shù)據(jù)庫(kù)查詢數(shù)據(jù),begin和end是網(wǎng)格參數(shù),比如begin="2013-07-01",end="2015-03-31"。部分查詢結(jié)果如下:

SPL 簡(jiǎn)化 SQL 案例詳解:行間計(jì)算

?????? A2:=A1.groups(year(ORDERDATE):y,month(ORDERDATE):m;sum(AMOUNT):mAmount)

?????? 這句代碼對(duì)訂單按照年份和月份進(jìn)行分組,并匯總求得每月的銷售額。函數(shù)groups可進(jìn)行分組匯總運(yùn)算,其參數(shù)分為兩部分,分號(hào)之前是分組表達(dá)式,即:year(ORDERDATE):y,month(ORDERDATE):m,分號(hào)之后是匯總表達(dá)式,即sum(AMOUNT):mAmount。匯總后的字段命名為mAmount。部分計(jì)算結(jié)果如下:

SPL 簡(jiǎn)化 SQL 案例詳解:行間計(jì)算

?????? A3:=A2.derive(mAmount/mAmount[-1]:lrr)

?????? 這句代碼在A2基礎(chǔ)上增加一個(gè)新的字段lrr,即按月比上期,其表達(dá)式為mAmount/mAmount[-1]。SPL可以用 [N]或[-N]來(lái)表達(dá)相對(duì)于當(dāng)前記錄的之后第N條記錄,或之前第N條記錄,因此代碼中mAmount代表當(dāng)期銷售額,mAmount[-1]代表上期銷售額。計(jì)算結(jié)果如下:

SPL 簡(jiǎn)化 SQL 案例詳解:行間計(jì)算

?????? 需要注意的是,初始月份的比上期值為空(即2013年7月)。

?????? A4:=A3.derive(mAmount/mAmount[-12]:yoy)

?????? 這句代碼在A4的基礎(chǔ)上增加一個(gè)新的字段yoy,即月銷售額的同期比。需要注意的是,初始年份(即2013年)各月份的同期比衡為空。部分結(jié)果如下:

SPL 簡(jiǎn)化 SQL 案例詳解:行間計(jì)算

?????? A5:=A4.sort(y:-1,m:-1)

為了看起來(lái)更清晰,我們將A5按照年月逆序進(jìn)行排序。結(jié)果如下:

SPL 簡(jiǎn)化 SQL 案例詳解:行間計(jì)算

?????? A6:>file("sales.csv").export@ct(A5)

?????? 這句代碼將計(jì)算結(jié)果導(dǎo)出到" sales.csv "文件,以便通過(guò)excel等工具來(lái)查看:

SPL 簡(jiǎn)化 SQL 案例詳解:行間計(jì)算

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