窗口函數(shù)的目的是以聲明的方式將業(yè)務(wù)報(bào)告需求轉(zhuǎn)換為SQL,從而使查詢性能和開發(fā)人員/業(yè)務(wù)分析師的效率得到顯著提高。 我看到現(xiàn)實(shí)世界的報(bào)告和儀表板在使用窗口功能后從幾小時(shí)到幾分鐘,幾分鐘到幾秒鐘。 查詢大小從40頁減少到幾頁。 早在上世紀(jì)90年代,Redbrick數(shù)據(jù)庫就真正理解了業(yè)務(wù)用例并創(chuàng)建了一個(gè)新的功能層來進(jìn)行業(yè)務(wù)報(bào)告,包括排名,運(yùn)行總計(jì),根據(jù)子組,位置等計(jì)算傭金和庫存。這些都是在SQL標(biāo)準(zhǔn)中每個(gè)BI層(如Tableau,Looker,Cognos)都利用此功能。
阿拉善盟網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián),阿拉善盟網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為阿拉善盟上1000+提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站制作要多少錢,請找那個(gè)售后服務(wù)好的阿拉善盟做網(wǎng)站的公司定做!
想象一下,通過兩輪比賽你有六個(gè)高爾夫球手。 現(xiàn)在,您需要?jiǎng)?chuàng)建排行榜并對(duì)其進(jìn)行排名。 使用SQL對(duì)它們進(jìn)行排名
播放機(jī) | 第1輪 | Round2 |
馬爾科 | 75 | 73 |
約翰 | 72 | 68 |
常 | 67 | 76 |
宵 | 74 | 71 |
Sitaram | 68 | 72 |
冰潔 | 71 | 67 |
將數(shù)據(jù)插入Couchbase。
INSERT INTO高爾夫
VALUES(“KP1”,{ “player”:“Marco”,“round1”:75,“round2”:73}),
VALUES(“KP2”,{ “player”:“Johan”,“round1”:72,“round2”:68}),
VALUES(“KP3”,{ “player”:“Chang”,“round1”:67,“round2”:76}),
VALUES(“KP4”,{ “player”:“Isha”,“round1”:74,“round2”:71}),
VALUES(“KP5”,{ “player”:“Sitaram”,“round1”:68,“round2”:72}),
VALUES(“KP6”,{ “玩家”:“冰潔”,“ROUND1”:71,“round2”:67});
沒有窗口功能(當(dāng)前狀態(tài) - Couchbase 6.0)
要在不使用窗口函數(shù)的情況下編寫查詢,您需要一個(gè)子查詢來計(jì)算每個(gè)玩家的等級(jí)。 該子查詢必須掃描所有數(shù)據(jù),導(dǎo)致 O(N ^ 2) 的最差算法復(fù)雜度 , 這大大增加了執(zhí)行時(shí)間和吞吐量。
用g1 作為(選擇球員,第1輪,第2輪從高爾夫球場)
SELECT g3 .player AS player,
(g3 .round 1 + g3 .round 2) AS T,
((g3 .round 1 + g3 .round 2) - 144) AS ToPar,
(選擇原始1 + COUNT(*)
從 g1 作為 g2
其中(g2 .round 1 + g2 .round 2)<
(g3 .round 1 + g3 .round 2))[ 0 ] AS sqlrankR2
從 g1 到 g3
ORDER BY sqlrankR2
結(jié)果:
T ToPar播放器sqlrankR2
138 - 6 “冰潔” 1
140 - 4 “約翰” 2
140 - 4 “Sitaram” 2
143 - 1 “Chang” 4
145 1 “Isha” 5
148 4 “Marco” 6
使用Mad-Hatter中的窗口函數(shù)(即將發(fā)布)
此查詢返回玩家,兩輪后的總數(shù)(T),分?jǐn)?shù)如何超過/低于標(biāo)準(zhǔn)(ToPar),然后 根據(jù)前兩輪的分?jǐn)?shù)對(duì)它們 進(jìn)行 排名 。 這是Mad-Hatter的新功能。 其時(shí)間復(fù)雜度為O(N),意味著執(zhí)行時(shí)間只會(huì)線性增加。
SELECT 播放器 AS播放器,
(round1 + round2) AS T,
((round1 + round2) - 144) AS ToPar,
RANK()OVER(ORDER BY(round1 + round2))AS rankR2
來自高爾夫;
T ToPar玩家等級(jí)R2
138 - 6 “冰潔” 1
140 - 4 “約翰” 2
140 - 4 “Sitaram” 2
143 - 1 “Chang” 4
145 1 “Isha” 5
148 4 “Marco” 6
觀察:
查詢簡單明了地表達(dá)了要求。
在真實(shí)場景中執(zhí)行此查詢的效果要好得多。 我們計(jì)劃衡量。
當(dāng)排名要求依賴于多個(gè)文檔時(shí),查詢變得非常復(fù)雜 - 編寫,優(yōu)化和運(yùn)行。
所有這些都會(huì)影響總體TCO。
現(xiàn)在,讓我們創(chuàng)建一個(gè)擴(kuò)展的儀表板。
顯示添加密集排名,行號(hào),領(lǐng)先者以及領(lǐng)導(dǎo)者背后的筆畫數(shù)。 報(bào)告中的所有非常常見的事情。 只要看到OVER()子句,就會(huì)看到新的窗口函數(shù)。 下面的查詢有六個(gè)窗口函數(shù)。
SELECT 播放器 AS播放器,
(round1 + round2) AS T,
((round1 + round2) - 144) AS ToPar,
RANK()OVER(ORDER BY(round1 + round2))AS rankR2,
DENSE_RANK()OVER(ORDER BY(round1 + round2))AS rankR2Dense,
ROW_NUMBER()OVER()rownum,
((round1 + round2) -
FIRST_VALUE(ROUND1 + round2)
OVER(ORDER BY(round1 + round2)))AS strokebehind,
RANK()OVER(ORDER BY(round1)) AS rankR1,
LAG(播放器,1,“無”)OVER(ORDER BY ROUND1 + round2)
AS inFront
從高爾夫球場
ORDER BY rankR2
T ToPar inFront player rankR1 rankR2 rankR2Dense rownum stroke behind behind
138 - 6 “無” “冰潔” 3 1 1 3 0
140 - 4 “Johan” “Sitaram” 2 2 2 2 2
140 - 4 “冰潔” “約翰” 4 2 2 4 2
143 - 1 “Sitaram” “Chang” 1 4 3 1 5
145 1 “Chang” “Isha” 5 5 4 5 7
148 4 “Isha” “Marco” 6 6 5 6 10
正如您之前看到的, 使用 子查詢方法 使用六個(gè)窗口函數(shù) 執(zhí)行此查詢 將是一個(gè)更大的努力,昂貴,容易出錯(cuò)的查詢。
除了將內(nèi)置聚合(COUNT,SUM,AVG等)作為窗口函數(shù),即將發(fā)布的版本將具有以下窗口函數(shù)。 它們中的每一個(gè)的語法和語義在標(biāo)準(zhǔn)中得到很好的定義,并在下面的參考部分的文章中進(jìn)行了充分描述。
RANK()
DENSE_RANK()
PERCENT_RANK()
CUME_DIST()
NTILE()
RATIO_TO_REPORT()
ROW_NUMBER()
LAG()
FIRST_VALUE()
LAST_VALUE()
NTH_VALUE()
LEAD()