1. 選出符合條件的成員
【例 1】 分欄列出歐洲和非洲人口超 200 萬的城市名稱及人口(每欄按從多到少排序)。世界城市人口表部分?jǐn)?shù)據(jù)如下:
ContinentCountryCityPopulation
AfricaEgyptCairo6789479
AsiaChinaShanghai24240000
EuropeBritainLondon7285000
…………
期望結(jié)果如下:
Europe CityPopulationAfrica CityPopulation
Moscow8389200Cairo6789479
London7285000Kinshasa5064000
St Petersburg4694000Alexandria3328196
…………
【SPL 腳本】
AB
1=connect("db").query("select * from World where Continent in('Europe','Africa') and Population >= 2000000")/連接數(shù)據(jù)庫(kù),取出歐洲和非洲超過 200 萬人口的記錄
2=A1.select(Continent:"Europe")/使用 A.select() 函數(shù)取出歐洲數(shù)據(jù)
3=A1.select(Continent:"Africa")/使用 A.select() 函數(shù)取出非洲數(shù)據(jù)
4=create('Europe City',Population,'Africa City', Population)/按目標(biāo)結(jié)構(gòu)創(chuàng)建一個(gè)空表
5=A4.paste(A2.(City),A2.(Population),A3.(City),A3.(Population))/使用 A.paste() 函數(shù)將值粘貼到對(duì)應(yīng)列
A4的執(zhí)行結(jié)果如下:
Europe CityPopulationAfrica CityPopulation
Moscow8389200Cairo6789479
London7285000Kinshasa5064000
St Petersburg4694000Alexandria3328196
…………
【例 2】 查詢紐約研發(fā)部門員工的全名和收入。部分?jǐn)?shù)據(jù)如下:
IDNAMESURNAMESTATEDEPTSALARY
1RebeccaMooreCaliforniaR&D7000
2AshleyWilsonNew YorkFinance11000
3RachelJohnsonNew MexicoSales9000
4EmilySmithTexasHR7000
5AshleySmithTexasR&D16000
………………
【SPL 腳本】
AB
1=connect("db")/連接數(shù)據(jù)源
2=A1.query("select * from Employee")/導(dǎo)入員工表
3=A2.select(STATE=="New York"&&DEPT=="R&D")/使用函數(shù) A.select() 選出紐約研發(fā)部門員工的記錄。需要同時(shí)滿足所有條件時(shí),可以使用符號(hào) "&&"。
4=A3.new(NAME+" "+SURNAME:FULLNAME, SALARY)/使用符號(hào) + 連接字符串,組成全名
A4的執(zhí)行結(jié)果如下:
FULLNAMESALARY
Matthew Johnson6000
Lauren Thomas12000
Brooke Williams12000
【例 3】 查詢各部門 30 歲以下和 50 歲以上的員工的人數(shù)。部分?jǐn)?shù)據(jù)如下:
IDNAMEBIRTHDAYSTATEDEPTSALARY
1Rebecca1974/11/20CaliforniaR&D7000
2Ashley1980/07/19New YorkFinance11000
3Rachel1970/12/17New MexicoSales9000
4Emily1985/03/07TexasHR7000
5Ashley1975/05/13TexasR&D16000
………………
【SPL 腳本】
AB
1=connect("db")/連接數(shù)據(jù)源
2=A1.query("select * from Employee")/導(dǎo)入員工表
3=A2.select((age=age(BIRTHDAY), age<30 || age>50))/使用函數(shù) A.select() 選出年齡小于 30 或者年齡大于 50 的員工。需要滿足多個(gè)條件中任意一個(gè)時(shí),可以使用符號(hào) "||"。
4=A3.groups(DEPT; count(~):Count)/分組匯總各部門滿足條件的人數(shù)
A4的執(zhí)行結(jié)果如下:
DEPTCount
49
55
63
76
81
2. 查找最大值 / 最小值對(duì)應(yīng)記錄
【例 4】 根據(jù)成績(jī)表,求一班數(shù)學(xué)成績(jī)最低的學(xué)生 ID。部分?jǐn)?shù)據(jù)如下:
CLASSSTUDENTIDSUBJECTSCORE
Class one1English84
Class one1Math77
Class one1PE69
Class one2English81
Class one2Math80
…………
【SPL 腳本】
AB
1=connect("db")/連接數(shù)據(jù)庫(kù)
2=A1.query("select * from Scores where SUBJECT='Math'and CLASS='Class one'")/查詢一班的數(shù)學(xué)成績(jī)
3=A2.minp(SCORE)/使用 A.minp() 函數(shù)選出最低分所在記錄
4=A3.STUDENTID/從記錄中取學(xué)生 ID
最小值所在記錄不一定是唯一的,如果想返回所有記錄,可以使用函數(shù) A.minp() 的選項(xiàng) @a :
AB
3=A2.minp@a(SCORE)/使用 A.minp() 函數(shù)的 @a 選項(xiàng),選出所有最高分的記錄
4=A3.(STUDENTID)/從多條記錄中取出學(xué)生 ID
A3的執(zhí)行結(jié)果如下:
CLASSSTUDENTIDSUBJECTSCORE
Class one5Math60
Class one14Math60
A4的執(zhí)行結(jié)果如下:
Member
5
14
【例 5】 根據(jù)奧運(yùn)會(huì)獎(jiǎng)牌榜統(tǒng)計(jì)表,求總成績(jī)蟬聯(lián)第一名屆數(shù)最長(zhǎng)的國(guó)家。部分?jǐn)?shù)據(jù)如下:
GameNationGoldSilverCopper
30USA462929
30China382723
30UK291719
30Russia242632
30Korea1387
……………
【SPL 腳本】
AB
1=file("Olympic.csv").import@cqt()/導(dǎo)入奧運(yùn)會(huì)歷屆排名
2=A1.sort@z(?Game, 1000000*Gold+1000*Silver+Copper)/按第幾屆和總成績(jī)降序排列
3=A2.group@o1(?Game)/每屆取一名,因?yàn)橛行蛞簿褪堑谝幻?div style="height:15px;">
4=A3.group@o(Nation)/將國(guó)家按原序分組
5=A4.maxp(~.len())/使用函數(shù) A.maxp() 選出成員數(shù)量最多的一組,也就是蟬聯(lián)次數(shù)最多的
A5的執(zhí)行結(jié)果如下:
GameNationGoldSilverCopper
10USA413230
9USA221816
8USA452727
7USA412728
3. 分區(qū)段查找數(shù)據(jù)
有時(shí)候我們需要通過計(jì)算數(shù)值在區(qū)間中的序號(hào),來獲取在集合中的對(duì)應(yīng)成員。比如根據(jù)考試成績(jī)返回評(píng)價(jià)(優(yōu)、良、中、差);根據(jù)家庭年收入返回家庭所處的資產(chǎn)等級(jí)(貧困、小康、中產(chǎn)、富裕等)。
【例 6】 根據(jù)成績(jī)表,統(tǒng)計(jì)英語(yǔ)科目?jī)?yōu)秀、及格和不及格的人數(shù)。部分?jǐn)?shù)據(jù)如下:
CLASSSTUDENTIDSUBJECTSCORE
Class one1English84
Class one1Math77
Class one1PE69
Class one2English81
Class one2Math80
…………
【SPL 腳本】
AB
1=connect("db").query("select * from Scores where SUBJECT='English'")/連接數(shù)據(jù)庫(kù),查詢英語(yǔ)成績(jī)
2=create(Assessment,Score).record(["fail",0,"pass",60,"excellent",90])/創(chuàng)建分?jǐn)?shù)與評(píng)價(jià)對(duì)照表
3=A1.derive(A2.segp(Score,SCORE).Assessment:Assessment)/使用 A.segp() 函數(shù)根據(jù)分?jǐn)?shù)在對(duì)照表中的區(qū)間序號(hào),獲取相應(yīng)的評(píng)價(jià)。
4=A3.groups(Assessment;count(1):Count)/按評(píng)價(jià)分組統(tǒng)計(jì)人數(shù)
A4的執(zhí)行結(jié)果如下:
AssessmentCount
excellent6
fail4
pass18
4. 選出前 N 名 / 后 N 名
【例 7】 根據(jù)成績(jī)表,求各班各科前兩名的學(xué)生 ID。部分?jǐn)?shù)據(jù)如下:
CLASSSTUDENTIDSUBJECTSCORE
Class one1English84
Class one1Math77
Class one1PE69
Class one2English81
Class one2Math80
…………
【SPL 腳本】
AB
1=connect("db")/連接數(shù)據(jù)庫(kù)
2=A1.query("select * from Scores")/查詢學(xué)生成績(jī)
3=A2.group(CLASS,SUBJECT;~.top(-2;SCORE):TOP2)/使用 A.top() 函數(shù)獲取每個(gè)班級(jí)各科目分?jǐn)?shù)的前兩名。其中 -2 表示從大到小取兩名。
4=A3.conj(TOP2)/將所有班級(jí)各科的前兩名記錄合并到一起
A4的執(zhí)行結(jié)果如下:
CLASSSTUDENTIDSUBJECTSCORE
Class one4English96
Class one9English93
Class one13Math97
Class one10Math97
…………
5. 根據(jù)主鍵值查找對(duì)應(yīng)記錄
根據(jù)主鍵值查找對(duì)應(yīng)記錄是很常見的操作,例如根據(jù)員工 ID 查找員工記錄,根據(jù)訂單 ID 查詢訂單詳細(xì)信息等等。
【例 8】 根據(jù)相互關(guān)聯(lián)的課程表和選課表,列出所有學(xué)生所選課程信息表,每個(gè)科目作為一列。課程表部分?jǐn)?shù)據(jù)如下:
IDNAMETEACHERID
1Environmental protection and …5
2Mental health of College Students1
3Computer language Matlab8
………
選課表部分?jǐn)?shù)據(jù)如下:
IDSTUDENT_NAMECOURSE
1Rebecca2,7
2Ashley1,8
3Rachel2,7,10
………
希望轉(zhuǎn)換成如下表格:
IDSTUDENT_NAMECOURSE1COURSE2COURSE3…
1RebeccaMental health of College StudentsInto Shakespeare
…
2AshleyEnvironmental protection and …Modern economics
…
3RachelMental health of College StudentsInto ShakespeareMusic appreciation…
………………
【SPL 腳本】
AB
1=connect("db")/連接數(shù)據(jù)庫(kù)
2=A1.query("select * from Course").keys(ID)/讀取課程表,并設(shè)置主鍵 ID
3=A1.query("select * from SelectCourse")/讀取學(xué)生選課表
4=A3.run(COURSE=COURSE.split@cp())/將選課表中的課程按逗號(hào)拆分后賦值給課程字段
5=A4.max(COURSE.len())/找到選課最多的數(shù)量
6=create(ID,STUDENT_NAME, ${A5.("COURSE"+string(~)).concat@c()})/創(chuàng)建空表,課程列按照最多的數(shù)量創(chuàng)建
7>A4.run(A6.record([ID,STUDENT_NAME]|COURSE.(A2.find(~).Name)))/循環(huán)選課表,將學(xué)生 ID、學(xué)生姓名以及使用 A.find() 函數(shù)查找出的課程名稱合并追加到 A6 的表中。
A6的執(zhí)行結(jié)果如下:
IDSTUDENT_NAMECOURSE1COURSE2COURSE3
1RebeccaMental health of College StudentsInto Shakespeare
2AshleyEnvironmental protection and …Modern economics
3RachelMental health of College StudentsInto ShakespeareMusic appreciation
……………
《
SPL CookBook》中還有更多相關(guān)計(jì)算示例。