4分鐘了解什么是SQL窗口函數(shù)
你也許很熟悉SQL的簡單查詢,比如使用SELECT FROM WHERE GROUP BY這樣的基礎(chǔ)語句,但是如果你想進(jìn)一步提升自己的SQL技能,你不能不知道窗口函數(shù)(Window Function),又被叫做分析函數(shù)(Analytics Function)。
什么是窗口函數(shù)/分析函數(shù)?
窗口函數(shù)是類似于可以返回聚合值的函數(shù),例如SUM(),COUNT(),MAX()。
但是窗口函數(shù)又與普通的聚合函數(shù)不同,它不會對結(jié)果進(jìn)行分組,使得輸出中的行數(shù)與輸入中的行數(shù)相同。
窗口函數(shù)剖析
一個窗口函數(shù)大概看起來是這樣:
- SELECT SUM() OVER(PARTITION BY ___ ORDER BY___) FROM Table
這里有3點(diǎn)需要牢記:
1. 聚合功能:在上述例子中,我們用了SUM(),但是你也可以用COUNT(), AVG()之類的計算功能
2. PARTITION BY:你只需將它看成GROUP BY子句,但是在窗口函數(shù)中,你要寫PARTITION BY
3. ORDER BY:ORDER BY和普通查詢語句中的ORDER BY沒什么不同。注意,輸出的順序要仔細(xì)考慮
示例:集合函數(shù)VS窗口函數(shù)
假設(shè)我們有如下這個表格:
如果要按性別獲取平均GPA,可以使用聚合函數(shù)并運(yùn)行以下查詢:
- SELECT Gender, AVG(GPA) as avg_gpa
- FROM students
- GROUP BY Gender
結(jié)果如下:
下一步是關(guān)鍵!
現(xiàn)在我們想得到如下結(jié)果:
我們當(dāng)然可以用我們剛剛提到的聚合函數(shù),然后再將結(jié)果join到初始表,但這需要兩個步驟。
但如果我們使用窗口函數(shù),我們則可以一步到位,并得到相同的結(jié)果:
- SELECT *,
- AVG(GPA) OVER (PARTITION BY Gender) as avg_gpa
- FROM table
通過上面的查詢,我們正在按性別對數(shù)據(jù)進(jìn)行劃分,并計算每種性別的平均GPA。然后,它將創(chuàng)建一個稱為avg_gpa的新列,并為每行附加關(guān)聯(lián)的平均GPA。
窗口函數(shù)的優(yōu)點(diǎn)
簡單
窗口函數(shù)更易于使用。在上面的示例中,與使用聚合函數(shù)然后合并結(jié)果相比,使用窗口函數(shù)僅需要多一行就可以獲得所需要的結(jié)果。
快速
這一點(diǎn)與上一點(diǎn)相關(guān),使用窗口函數(shù)比使用替代方法要快得多。當(dāng)你處理成百上千個千兆字節(jié)的數(shù)據(jù)時,這非常有用。
多功能
性最重要的是,窗口函數(shù)具有多種功能,本文并沒有提及這個功能,比如,包括添加移動平均線,添加行號和滯后數(shù)據(jù),等等。
結(jié)語
讀到這里,你大概對窗口函數(shù)有了初步認(rèn)識。希望本文提及的例子對你理解窗口函數(shù)有幫助??偠灾M愕腟QL可以越來越厲害!