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