<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
OVER用於為行定義一個視窗,它對一組值進行操作,不需要使用GROUP BY子句對資料進行分組,能夠在同一行中同時返回基礎行的列和聚合列。
OVER ( [ PARTITION BY column ] [ ORDER BY culumn ] )
PARTITION BY 子句進行分組;
ORDER BY 子句進行排序。
視窗函數OVER()指定一組行,開窗函數計算從視窗函數輸出的結果集中各行的值。
開窗函數不需要使用GROUP BY就可以對資料進行分組,還可以同時返回基礎行的列和聚合列。
OVER開窗函數必須與聚合函數或排序函數一起使用,聚合函數一般指SUM(),MAX(),MIN,COUNT(),AVG()等常見函數。排序函數一般指RANK(),ROW_NUMBER(),DENSE_RANK(),NTILE()等。
我們以SUM和COUNT函數作為範例來給大家演示。
--建立測試表和測試資料 CREATE TABLE Employee ( ID INT PRIMARY KEY, Name VARCHAR(20), GroupName VARCHAR(20), Salary INT ) INSERT INTO Employee VALUES(1,'小明','開發部',8000), (4,'小張','開發部',7600), (5,'小白','開發部',7000), (8,'小王','財務部',5000), (9, null,'財務部',NULL), (15,'小劉','財務部',6000), (16,'小高','行政部',4500), (18,'小王','行政部',4000), (23,'小李','行政部',4500), (29,'小吳','行政部',4700);
SELECT *, SUM(Salary) OVER(PARTITION BY Groupname) 每個組的總工資, SUM(Salary) OVER(PARTITION BY groupname ORDER BY ID) 每個組的累計總工資, SUM(Salary) OVER(ORDER BY ID) 累計工資, SUM(Salary) OVER() 總工資 from Employee
(提示:可以左右滑動程式碼)
結果如下:
其中開窗函數的每個含義不同,我們來具體解讀一下:
SUM(Salary) OVER (PARTITION BY Groupname)
只對PARTITION BY後面的列Groupname進行分組,分組後求解Salary的和。
SUM(Salary) OVER (PARTITION BY Groupname ORDER BY ID)
對PARTITION BY後面的列Groupname進行分組,然後按ORDER BY 後的ID進行排序,然後在組內對Salary進行累加處理。
SUM(Salary) OVER (ORDER BY ID)
只對ORDER BY 後的ID內容進行排序,對排完序後的Salary進行累加處理。
SUM(Salary) OVER ()
對Salary進行彙總處理
SELECT *, COUNT(*) OVER(PARTITION BY Groupname ) 每個組的個數, COUNT(*) OVER(PARTITION BY Groupname ORDER BY ID) 每個組的累積個數, COUNT(*) OVER(ORDER BY ID) 累積個數 , COUNT(*) OVER() 總個數 from Employee
返回的結果如下圖:
後面的每個開窗函數就不再一一解讀了,可以對照上面SUM後的開窗函數進行一一對照。
我們對4個排序函數一一演示
--先建立測試表和測試資料 WITH t AS (SELECT 1 StuID,'一班' ClassName,70 Score UNION ALL SELECT 2,'一班',85 UNION ALL SELECT 3,'一班',85 UNION ALL SELECT 4,'二班',80 UNION ALL SELECT 5,'二班',74 UNION ALL SELECT 6,'二班',80 ) SELECT * INTO Scores FROM t; SELECT * FROM Scores
定義:ROW_NUMBER()函數作用就是將SELECT查詢到的資料進行排序,每一條資料加一個序號,他不能用做於學生成績的排名,一般多用於分頁查詢,比如查詢前10個 查詢10-100個學生。ROW_NUMBER()必須與ORDER BY一起使用,否則會報錯。
對學生成績排序
SELECT *, ROW_NUMBER() OVER (PARTITION BY ClassName ORDER BY SCORE DESC) 班內排序, ROW_NUMBER() OVER (ORDER BY SCORE DESC) AS 總排序 FROM Scores;
結果如下:
這裡的PARTITION BY和ORDER BY的作用與我們在上面看到的聚合函數的作用一樣,都是用來進行分組和排序使用的。
此外ROW_NUMBER()函數還可以取指定順序的資料。
SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (ORDER BY SCORE DESC) AS 總排序 FROM Scores ) t WHERE t.總排序=2;
結果如下:
定義:RANK()函數,顧名思義排名函數,可以對某一個欄位進行排名,這裡和ROW_NUMBER()有什麼不一樣呢?ROW_NUMBER()是排序,當存在相同成績的學生時,ROW_NUMBER()會依次進行排序,他們序號不相同,而Rank()則不一樣。如果出現相同的,他們的排名是一樣的。下面看例子:
範例
SELECT ROW_NUMBER() OVER (ORDER BY SCORE DESC) AS [RANK],* FROM Scores; SELECT RANK() OVER (ORDER BY SCORE DESC) AS [RANK],* FROM Scores;
結果:
其中上圖是ROW_NUMBER()的結果,下圖是RANK()的結果。當出現兩個學生成績相同是裡面出現變化。RANK()是1-1-3-3-5-6,而ROW_NUMBER()則還是1-2-3-4-5-6,這就是RANK()和ROW_NUMBER()的區別了。
定義:DENSE_RANK()函數也是排名函數,和RANK()功能相似,也是對欄位進行排名,那它和RANK()到底有什麼不同那?特別是對於有成績相同的情況,DENSE_RANK()排名是連續的,RANK()是跳躍的排名,一般情況下用的排名函數就是RANK() 我們看例子:
範例
SELECT RANK() OVER (ORDER BY SCORE DESC) AS [RANK],* FROM Scores; SELECT DENSE_RANK() OVER (ORDER BY SCORE DESC) AS [RANK],* FROM Scores;
結果如下:
上面是RANK()的結果,下面是DENSE_RANK()的結果
定義:NTILE()函數是將有序分割區中的行分發到指定數目的組中,各個組有編號,編號從1開始,就像我們說的'分割區'一樣 ,分為幾個區,一個區會有多少個。
SELECT *,NTILE(1) OVER (ORDER BY SCORE DESC) AS 分割區後排序 FROM Scores; SELECT *,NTILE(2) OVER (ORDER BY SCORE DESC) AS 分割區後排序 FROM Scores; SELECT *,NTILE(3) OVER (ORDER BY SCORE DESC) AS 分割區後排序 FROM Scores;
結果如下:
就是將查詢出來的記錄根據NTILE函數裡的引數進行平分分割區。
OVER開窗函數是我們工作中經常要使用到的,特別是在做資料分析計算的時候,經常要對資料進行分組排序。上面我們額外介紹了聚合函數和排序函數的與OVER結合的使用方法,此外還有很多與OVER一起使用的函數,比如LEAD函數,LAG函數,STRING_AGG函數等等都會使用到開窗函數OVER,其使用方法也要務必掌握。
到此這篇關於SQL中開窗函數的文章就介紹到這了,更多相關SQL開窗函數內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45