SQLServer三種開(kāi)窗函數(shù)詳細(xì)用法
一,開(kāi)窗函數(shù)的語(yǔ)法
開(kāi)窗函數(shù)的語(yǔ)法為:over(partition by 列名1 order by 列名2 ),括號(hào)中的兩個(gè)關(guān)鍵詞partition by 和order by 可以只出現(xiàn)一個(gè)。over() 前面是一個(gè)函數(shù),如果是聚合函數(shù),那么order by 不能一起使用。
二,從聚合開(kāi)窗函數(shù)sum(score) over(partition by name )講起
實(shí)不相瞞我看一眼就會(huì)了(假的,其實(shí)這種又臭又長(zhǎng)的字實(shí)在懶得看)
sum(score) over(partition by name )
sum()是聚合函數(shù),其實(shí)我聚合函數(shù)還沒(méi)學(xué)明白,當(dāng) sum()函數(shù) 后面跟上 over()以后,由sum聚合函數(shù)就成為了開(kāi)窗函數(shù)。
over() 括號(hào)里面就是定義窗口的內(nèi)容了,partition 是分區(qū),分組的意思。partition by 就是根據(jù)某個(gè)字段分組。
所以sum(score) over(partition by name ) ,就是先根據(jù) name 分組(如圖),當(dāng)前面加了sum(score)后就把根據(jù)name分組后的,每個(gè)(組)窗口里面的字段 score進(jìn)行求和操作。
select *,sum(score) over(partition by name) sum窗口函數(shù)舉例 from kchs -- 為了簡(jiǎn)單就只有兩個(gè)字段,name和score
聚合函數(shù)同樣需要對(duì)數(shù)據(jù)進(jìn)行排序,但不會(huì)顯示排名結(jié)果。會(huì)將當(dāng)前名次的數(shù)據(jù) 與 排在這之前的所有數(shù)據(jù) 依次做相應(yīng)的計(jì)算。
執(zhí)行語(yǔ)句:
select *, sum(score) over (order by id) as 累加求和 from kchs
拓展一下:
一,很多聚合函數(shù)都可以用作窗口函數(shù)的運(yùn)算,如SUM、AVG、MAX、MIN、COUNT。
二,和gropu by 不同的是窗口函數(shù)會(huì)生成多行,而不是想group by 一樣只有一行
三,開(kāi)窗函數(shù)之first_value,last_value,lead,lag
first_value:是在窗口里面取到第一個(gè)值
first_value(score) over( partition by name)as first_score , 根據(jù)name分區(qū)(組),取score列的第一個(gè)值
last_value:是在窗口里面取到最后一個(gè)值
last_value(score) over(partition by name) as last_score --根據(jù)name分區(qū)(組),取score列的最后一個(gè)值
lead 是取當(dāng)前行的上 N 條數(shù)據(jù),并且可以設(shè)置默認(rèn)值
lead(score,1,0) over(partition by name ) as lead_score --根據(jù)name分區(qū)(組),score列當(dāng)前行的上面N行,,如果沒(méi)有就為默認(rèn)值0
lag 是取當(dāng)前行的下 N 條數(shù)據(jù),并且可以設(shè)置默認(rèn)值
lag(score,1,0) over(partition by name ) as lag_score --根據(jù)name分區(qū)(組),score列當(dāng)前行的下面N行,如果沒(méi)有就為默認(rèn)值0
四,排名開(kāi)窗函數(shù)ROW_NUMBER、DENSE_RANK、RANK
row_number ()是為每組的行設(shè)置一個(gè)連續(xù)的遞增的數(shù)字(123456)
ROW_NUMBER() over( partition by name order by score asc)as ROW_NUMBER_score
rank()是排名,也為每一組的行生成一個(gè)序號(hào),如果有相同的值會(huì)生成相同的序號(hào),并且接下來(lái)的序號(hào)是不連序的。例如:有三個(gè)人并列第一名,第四名序號(hào)為四(111456)
rank() over(partition by name order by score asc) as RANK_score
DENSE_RANK()和RANK()類似,不同的是如果有相同的序號(hào),那么接下來(lái)的序號(hào)不會(huì)間斷。例如:有三個(gè)人并列第一,第四名序號(hào)為2(111234)
DENSE_RANK() over(partition by name order by score asc) as DENSE_RANK_score
注意:
一,排名開(kāi)窗函數(shù)可以單獨(dú)使用ORDER BY 語(yǔ)句,也可以和PARTITION BY同時(shí)使用。
二,ORDER BY 指定排名開(kāi)窗函數(shù)的順序,在排名開(kāi)窗函數(shù)中必須使用ORDER BY語(yǔ)句。
三,PARTITION BY用于將結(jié)果集進(jìn)行分組,開(kāi)窗函數(shù)應(yīng)用于每一組。
到此這篇關(guān)于SQLServer三種開(kāi)窗函數(shù)詳細(xì)用法的文章就介紹到這了,更多相關(guān)SQLServer 開(kāi)窗函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
sqlserver中比較一個(gè)字符串中是否含含另一個(gè)字符串中的一個(gè)字符
sql中比較一個(gè)字符串中是否含有另一個(gè)字符串中的一個(gè)字符的實(shí)現(xiàn)代碼,需要的朋友可以參考下。2010-09-09SQL語(yǔ)句練習(xí)實(shí)例之七 剔除不需要的記錄行
相信大家肯定經(jīng)常會(huì)把數(shù)據(jù)導(dǎo)入到數(shù)據(jù)庫(kù)中,但是可能會(huì)有些記錄行的所有列的數(shù)據(jù)是null,這為null的數(shù)據(jù)是我們不需要2011-10-10sql server使用公用表表達(dá)式CTE通過(guò)遞歸方式編寫(xiě)通用函數(shù)自動(dòng)生成連續(xù)數(shù)字和日期
CTE是在內(nèi)存中準(zhǔn)備好數(shù)據(jù),而不是每次一條往返服務(wù)器和客戶端一次。如果需要再插入到臨時(shí)表的話就是全部數(shù)據(jù)一次性插入。 這篇文章主要介紹了sql server使用公用表表達(dá)式CTE通過(guò)遞歸方式編寫(xiě)通用函數(shù)自動(dòng)生成連續(xù)數(shù)字和日期 ,需要的朋友可以參考下2019-07-07SQLServer中bigint轉(zhuǎn)int帶符號(hào)時(shí)報(bào)錯(cuò)問(wèn)題解決方法
用一個(gè)函數(shù)來(lái)解決SQLServer中bigint轉(zhuǎn)int帶符號(hào)時(shí)報(bào)錯(cuò)問(wèn)題,經(jīng)測(cè)試可用,有類似問(wèn)題的朋友可以參考下2014-09-09完美解決MSSQL"以前的某個(gè)程序安裝已在安裝計(jì)算機(jī)上創(chuàng)建掛起的文件操作"
以前裝過(guò)sql server,后來(lái)刪掉。現(xiàn)在重裝,卻出現(xiàn)“以前的某個(gè)程序安裝已在安裝計(jì)算機(jī)上創(chuàng)建掛起的文件操作。運(yùn)行安裝程序之前必須重新啟動(dòng)計(jì)算機(jī)”錯(cuò)誤。無(wú)法進(jìn)行下去。 現(xiàn)在又遇到了,終于完全搞定.2008-11-11詳解partition by和group by對(duì)比
這篇文章主要介紹了詳解partition by和group by對(duì)比,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09SQL SERVER2012中新增函數(shù)之字符串函數(shù)CONCAT詳解
SQL Server 2012有一個(gè)新函數(shù),就是CONCAT函數(shù),連接字符串非它莫屬。比如在它出現(xiàn)之前,連接字符串是使用"+"來(lái)連接,如遇上NULL,還得設(shè)置參數(shù)與配置,不然連接出來(lái)的結(jié)果將會(huì)是一個(gè)NULL。本文就介紹了關(guān)于SQL SERVER 2012中CONCAT函數(shù)的相關(guān)資料,需要的朋友可以參考。2017-03-03SQL Server中參數(shù)化SQL寫(xiě)法遇到parameter sniff ,導(dǎo)致不合理執(zhí)行計(jì)劃重用的快速解決方法
這篇文章主要介紹了SQL Server中參數(shù)化SQL寫(xiě)法遇到parameter sniff ,導(dǎo)致不合理執(zhí)行計(jì)劃重用的快速解決方法的相關(guān)資料,需要的朋友可以參考下2016-07-07