SQL中的開窗函數(shù)詳解可代替聚合函數(shù)使用
在沒(méi)學(xué)習(xí)開窗函數(shù)之前,我們都知道,用了分組之后,查詢字段就只能是分組字段和聚合的字段,這帶來(lái)了極大的不方便,有時(shí)我們查詢時(shí)需要分組,又需要查詢不分組的字段,每次都要又到子查詢,這樣顯得sql語(yǔ)句復(fù)雜難懂,給維護(hù)代碼的人帶來(lái)很大的痛苦,然而開窗函數(shù)出現(xiàn)了,曙光也來(lái)臨了。如果要想更具體了解開窗函數(shù),請(qǐng)看書《程序員的SQL金典》,開窗函數(shù)在mysql不能使用。
開窗函數(shù)與聚合函數(shù)一樣,都是對(duì)行的集合組進(jìn)行聚合計(jì)算。它用于為行定義一個(gè)窗口(這里的窗口是指運(yùn)算將要操作的行的集合),它對(duì)一組值進(jìn)行操作,不需要使用group by語(yǔ)句對(duì)數(shù)據(jù)進(jìn)行分組,能夠在同一行中同時(shí)返回基礎(chǔ)行的列和聚合列。定義看不懂不要緊,會(huì)用就行。
舉個(gè)簡(jiǎn)單例子 查詢每個(gè)工資小于5000的員工信息(姓名,城市 年齡 薪水),并且顯示小于5000的員工個(gè)數(shù),嘗試使用下面語(yǔ)句:
SELECT FName, FCITY, FAGE, FSalary, COUNT(FName) FROM T_Person WHERE FSALARY<5000
消息 8120,級(jí)別 16,狀態(tài) 1,第 1 行
選擇列表中的列 'T_Person.FName' 無(wú)效,因?yàn)樵摿袥](méi)有包含在聚合函數(shù)或 GROUP BY 子句中。
可以使用子查詢實(shí)現(xiàn),語(yǔ)句:
SELECT FName, FCITY, FAGE, FSalary, ( SELECT COUNT(FName) FROM T_Person WHERE FSALARY<5000 ) PersonNum FROM T_Person WHERE FSALARY<5000
結(jié)果:

使用開窗函數(shù)實(shí)現(xiàn),查詢結(jié)果一模一樣,就不粘貼了:
SELECT FName, FCITY, FAGE, FSalary, COUNT(FName) OVER() as PersonNum FROM T_Person WHERE FSALARY<5000
1.開窗函數(shù)格式:函數(shù)名(列) OVER(選項(xiàng))
2.聚合開窗函數(shù)格式:聚合函數(shù)(列) OVER(PARTITION BY 字段)
over關(guān)鍵字把聚合函數(shù)當(dāng)成聚合開窗函數(shù)而不是聚合函數(shù),SQL標(biāo)準(zhǔn)允許將所有的聚合函數(shù)用做聚合開窗函數(shù)。OVER關(guān)鍵字后的括號(hào)中還經(jīng)常添加選項(xiàng)用以改變進(jìn)行聚合運(yùn)算的窗口范圍。如果OVER關(guān)鍵字后的括號(hào)為空,則開窗函數(shù)會(huì)對(duì)結(jié)果集合的所有行進(jìn)行聚合運(yùn)算。
PARTITION BY來(lái)定義行的分區(qū)來(lái)進(jìn)行聚合運(yùn)算,與group by 不同,partition by 字句創(chuàng)建的分區(qū)是獨(dú)立于結(jié)果集的,創(chuàng)建的分區(qū)只是用于進(jìn)行聚合運(yùn)算,而且不同的開窗函數(shù)所創(chuàng)建的分區(qū)不互相影響,例如:查詢所有人員的信息,并查詢所屬城市的人員數(shù)以及同年齡的人員數(shù):
SELECT FName,FCITY, FAGE, FSalary, COUNT(FName) OVER(PARTITION BY FCITY) CityNum, COUNT(FName) OVER(PARTITION BY FAGE) AgeNum FROM T_Person ORDER by FCITY

查詢所有人員的信息,并查詢所屬城市的人員數(shù),每個(gè)城市的人按照年齡排序語(yǔ)句:
SELECT FName,FCITY, FAGE, FSalary, COUNT(FName) OVER(PARTITION BY FCITY ORDER BY FAGE) CityNum FROM T_Person

3.排序開窗函數(shù)格式:排序函數(shù)() OVER(ORDER BY 字段)
(1)主要函數(shù)有ROW_NUMBER()、RANK()、DENSE_RANK()、NTILE()
ROW_NUMBER() 加行號(hào),一般可以用于分頁(yè)查詢(現(xiàn)在被offset fetch取代 ),對(duì)于沒(méi)有主鍵列的表加行號(hào)作用很明顯,刪除重復(fù)數(shù)據(jù)等。
按照薪水高低給所有人員排序,同樣薪水的排名不一樣,可以用row_number(),
with a as ( SELECT FName, FSalary, FCity, FAge, ROW_NUMBER() over(ORDER BY FSalary) as RowNum FROM T_Person ) SELECT * FROM a

使用rank()將每個(gè)城市的薪水排行,值一樣的同一個(gè)排名,出現(xiàn)兩個(gè)第一名的時(shí)候,排在兩個(gè)第一名后的排名將是第三名
SELECT FName, FSalary, FCity, FAge, RANK() over(PARTITION BY FCITY ORDER BY FSalary) as RankNum FROM T_Person

使用dense_rank()將每個(gè)城市的薪水排行,值一樣的同一個(gè)排名,出現(xiàn)兩個(gè)第一名的時(shí)候,排在兩個(gè)第一名后的排名將是第三名

ntile(數(shù)字) over(order by 字段):數(shù)字表示一組多少個(gè)數(shù),并根據(jù)數(shù)量得出分組的數(shù)量
SELECT *,NTILE(5) OVER(ORDER BY FSalary) AS NileNum FROM T_Person

總結(jié)
到此這篇關(guān)于SQL中的開窗函數(shù)詳解可代替聚合函數(shù)使用的文章就介紹到這了,更多相關(guān)SQL 開窗函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
sqlserver 快速生成漢字的首拼字母的函數(shù)(經(jīng)典)
經(jīng)常要對(duì)姓名按拼音搜索,所以需要做如下函數(shù)來(lái)快速獲取首拼,需要的朋友可以參考下2012-05-05
sqlserver索引的原理及索引建立的注意事項(xiàng)小結(jié)
本文起點(diǎn)可能會(huì)相對(duì)高點(diǎn),首先你的很熟悉索引以及他們的存儲(chǔ)結(jié)構(gòu) 有很多地方你可能覺(jué)得有異議,歡迎一起討論2012-07-07
SQLServer 觸發(fā)器 數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)備份
首先,你需要建立測(cè)試數(shù)據(jù)表,一個(gè)用于插入數(shù)據(jù):test3,另外一個(gè)作為備份:test3_bak2009-07-07
不同數(shù)據(jù)庫(kù)之間導(dǎo)入導(dǎo)出功能介紹
在SQL Server中使用最廣泛的就是通過(guò)SELECT INTO語(yǔ)句導(dǎo)出數(shù)據(jù),SELECT INTO語(yǔ)句同時(shí)具備兩個(gè)功能2010-12-12
SQL Server實(shí)現(xiàn)將特定字符串拆分并進(jìn)行插入操作的方法
這篇文章主要介紹了SQL Server實(shí)現(xiàn)將特定字符串拆分并進(jìn)行插入操作的方法,涉及SQL Server的循環(huán)、遍歷、判定及插入等相關(guān)操作技巧,需要的朋友可以參考下2016-08-08
SQL Server 作業(yè)的備份(備份作業(yè)非備份數(shù)據(jù)庫(kù))
我的方法是把作業(yè)導(dǎo)出成文件備份起來(lái),因?yàn)楫?dāng)你服務(wù)器維護(hù)的多了的時(shí)候很多你的作業(yè) 就很成問(wèn)題,很麻煩2012-06-06
關(guān)于SQL表中drop?table和delete?table的區(qū)別
刪表是一個(gè)比較危險(xiǎn)的操作,這次給了個(gè)機(jī)會(huì)就想嘗試下,記得在mysql表中有兩種操作,drop與delete,但是在maxcompute產(chǎn)品中嘗試時(shí),該產(chǎn)品只支持drop操作。這里說(shuō)下二者操作的區(qū)別,需要的朋友可以參考下2023-01-01
SQL SERVER修改函數(shù)名容易引發(fā)的問(wèn)題分析
這篇文章主要介紹了SQL SERVER修改函數(shù)名容易引發(fā)的問(wèn)題分析的相關(guān)資料,需要的朋友可以參考下2016-02-02

