SQLServer三種開窗函數(shù)詳細(xì)用法
一,開窗函數(shù)的語法
開窗函數(shù)的語法為:over(partition by 列名1 order by 列名2 ),括號中的兩個(gè)關(guān)鍵詞partition by 和order by 可以只出現(xiàn)一個(gè)。over() 前面是一個(gè)函數(shù),如果是聚合函數(shù),那么order by 不能一起使用。
二,從聚合開窗函數(shù)sum(score) over(partition by name )講起
實(shí)不相瞞我看一眼就會了(假的,其實(shí)這種又臭又長的字實(shí)在懶得看)
sum(score) over(partition by name )
sum()是聚合函數(shù),其實(shí)我聚合函數(shù)還沒學(xué)明白,當(dāng) sum()函數(shù) 后面跟上 over()以后,由sum聚合函數(shù)就成為了開窗函數(shù)。
over() 括號里面就是定義窗口的內(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 -- 為了簡單就只有兩個(gè)字段,name和score

聚合函數(shù)同樣需要對數(shù)據(jù)進(jìn)行排序,但不會顯示排名結(jié)果。會將當(dāng)前名次的數(shù)據(jù) 與 排在這之前的所有數(shù)據(jù) 依次做相應(yīng)的計(jì)算。
執(zhí)行語句:
select *, sum(score) over (order by id) as 累加求和 from kchs

拓展一下:
一,很多聚合函數(shù)都可以用作窗口函數(shù)的運(yùn)算,如SUM、AVG、MAX、MIN、COUNT。
二,和gropu by 不同的是窗口函數(shù)會生成多行,而不是想group by 一樣只有一行
三,開窗函數(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行,,如果沒有就為默認(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行,如果沒有就為默認(rèn)值0

四,排名開窗函數(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è)序號,如果有相同的值會生成相同的序號,并且接下來的序號是不連序的。例如:有三個(gè)人并列第一名,第四名序號為四(111456)
rank() over(partition by name order by score asc) as RANK_score
DENSE_RANK()和RANK()類似,不同的是如果有相同的序號,那么接下來的序號不會間斷。例如:有三個(gè)人并列第一,第四名序號為2(111234)
DENSE_RANK() over(partition by name order by score asc) as DENSE_RANK_score

注意:
一,排名開窗函數(shù)可以單獨(dú)使用ORDER BY 語句,也可以和PARTITION BY同時(shí)使用。
二,ORDER BY 指定排名開窗函數(shù)的順序,在排名開窗函數(shù)中必須使用ORDER BY語句。
三,PARTITION BY用于將結(jié)果集進(jìn)行分組,開窗函數(shù)應(yīng)用于每一組。
到此這篇關(guān)于SQLServer三種開窗函數(shù)詳細(xì)用法的文章就介紹到這了,更多相關(guān)SQLServer 開窗函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mybatis4 之Mybatis動態(tài)sql的實(shí)現(xiàn)代碼
這篇文章主要介紹了Mybatis4 之Mybatis動態(tài)sql的實(shí)現(xiàn)代碼,本文給大家提到了靜態(tài)sql與動態(tài)sql有什么區(qū)別,通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
SQL?Server數(shù)據(jù)庫表的創(chuàng)建與管理操作大全
這篇文章主要給大家介紹了關(guān)于SQL?Server數(shù)據(jù)庫表的創(chuàng)建與管理操作的相關(guān)資料,?SQL?Server是一個(gè)關(guān)系型數(shù)據(jù)庫管理系統(tǒng),它可以幫助用戶創(chuàng)建、管理和查詢數(shù)據(jù),文中介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01
SQL Server 字符集驗(yàn)證的實(shí)現(xiàn)
SQL Server 中的字符集和排序規(guī)則決定了數(shù)據(jù)如何存儲、比較和排序,理解字符集配置對數(shù)據(jù)庫的正常運(yùn)行至關(guān)重要,下面就來詳細(xì)的介紹一下SQL Server 字符集驗(yàn)證的實(shí)現(xiàn),感興趣的可以了解一下2026-03-03
關(guān)于重新組織和重新生成索引sp_RefreshIndex的介紹
本篇文章小編為大家介紹,關(guān)于重新組織和重新生成索引sp_RefreshIndex的介紹。需要的朋友參考下2013-04-04
sqlserver中更改數(shù)據(jù)庫所屬為dbo的方法
sqlserver中更改數(shù)據(jù)庫所屬為dbo的方法,需要的朋友可以參考下。2010-11-11
SQL2000個(gè)人版 應(yīng)用程序正常初始化失敗0乘以C0000135失敗
應(yīng)用程序正常初始化(0*c0000135)失敗。是什么意思?2011-01-01
SQL語句的各個(gè)關(guān)鍵字的解析過程詳細(xì)總結(jié)
由于最近需要做一些sql query性能提升的研究,因此研究了一下sql語句的解析過程;本文是我在看了各種資料后手機(jī)總結(jié)的,會詳細(xì)的,一步一步的講述一個(gè)sql語句的各個(gè)關(guān)鍵字的解析過程,歡迎大家互相學(xué)習(xí)2013-01-01
如何監(jiān)測和優(yōu)化OLAP數(shù)據(jù)庫
微軟SQL Server分析服務(wù)(SSAS)提供了一個(gè)用來創(chuàng)建和管理數(shù)據(jù)挖掘應(yīng)用和在線分析處理系統(tǒng)的強(qiáng)大引擎,你應(yīng)該仔細(xì)的監(jiān)測和優(yōu)化OLAP數(shù)據(jù)庫和潛在的關(guān)系數(shù)據(jù)源。2015-09-09
SQLServer獲取臨時(shí)表所有列名或是否存在指定列名的方法
本文介紹了SQLServer獲取臨時(shí)表所有列名或是否存在指定列名的方法,需要的朋友一起來看下吧2016-12-12

