Sql Server數(shù)據(jù)庫開窗函數(shù)Over()的使用實(shí)例詳解
文章主要介紹了Sql Server 開窗函數(shù)Over()的使用,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下利用over(),將統(tǒng)計信息計算出來,然后直接篩選結(jié)果集 declare @t table(...
利用over(),將統(tǒng)計信息計算出來,然后直接篩選結(jié)果集
- declare- @t- table- (
- ProductID- int- ,
- ProductName- varchar- (20),
- ProductType- varchar- (20),
- Price- int- )
- insert- @t
- select- 1,- 'name1'- ,- 'P1'- ,3- union- all
- select- 2,- 'name2'- ,- 'P1'- ,5- union- all
- select- 3,- 'name3'- ,- 'P2'- ,4- union- all
- select- 4,- 'name4'- ,- 'P2'- ,4
查詢要求:查出每類產(chǎn)品中價格最高的信息
--做法一:找到每個組里,價格最大的值;然后再找出每個組里價格等于這個值的
--缺點(diǎn):要進(jìn)行一次join    
- select- t1.*- from- @t t1
- join- (- select- ProductType,- max- (Price) Price- from- @t- group- by- ProductType) t2
- on- t1.ProductType = t2.ProductType
- where- t1.Price = t2.Price
- order- by- ProductType
--做法二:利用over(),將統(tǒng)計信息計算出來,然后直接篩選結(jié)果集。
--over() 可以讓函數(shù)(包括聚合函數(shù))與行一起輸出。 
- ;- with- cte- as- (- select- *,- max- (Price) over(partition- by- (ProductType)) MaxPrice- from- @t)
- select- ProductID,ProductName,ProductType,Price- from- cte- where- Price = MaxPrice
- order- by- ProductType
-over() 的語法為:over([patition by ] <order by >)。需要注意的是,over() 前面是一個函數(shù),如果是聚合函數(shù),那么order by 不能一起使用。
--over() 的另一常用情景是與 row_number() 一起用于分頁。
現(xiàn)在來介紹一下開窗函數(shù)。
窗口函數(shù)OVER()指定一組行,開窗函數(shù)計算從窗口函數(shù)輸出的結(jié)果集中各行的值。
開窗函數(shù)不需要使用GROUP BY就可以對數(shù)據(jù)進(jìn)行分組,還可以同時返回基礎(chǔ)行的列和聚合列。
1.排名開窗函數(shù)
ROW_NUMBER、DENSE_RANK、RANK、NTILE屬于排名函數(shù)。
排名開窗函數(shù)可以單獨(dú)使用ORDER BY 語句,也可以和PARTITION BY同時使用。
PARTITION BY用于將結(jié)果集進(jìn)行分組,開窗函數(shù)應(yīng)用于每一組。
ODER BY 指定排名開窗函數(shù)的順序。在排名開窗函數(shù)中必須使用ORDER BY語句。
例如查詢每個雇員的定單,并按時間排序
- ;- WITH- OrderInfo- AS
- (
- SELECT- ROW_NUMBER() OVER(PARTITION- BY- EmployeeID- ORDER- BY- OrderDate)- AS- Number,
- OrderID,CustomerID, EmployeeID,OrderDate- FROM- Orders (NOLOCK)
- )
- SELECT- Number,OrderID,CustomerID, EmployeeID ,OrderDate
- From- OrderInfo- WHERE- Number- BETWEEN- 0- AND- 10
窗口函數(shù)根據(jù)PARTITION BY語句按雇員ID對數(shù)據(jù)行分組,然后按照ORDER BY 語句排序,排名函數(shù)ROW_NUMBER()為每一組的數(shù)據(jù)分從1開始生成一個序號。
ROW_NUMBER()為每一組的行按順序生成一個唯一的序號
RANK()也為每一組的行生成一個序號,與ROW_NUMBER()不同的是如果按照ORDER BY的排序,如果有相同的值會生成相同的序號,并且接下來的序號是不連序的。例如兩個相同的行生成序號3,那么接下來會生成序號5。
DENSE_RANK()和RANK()類似,不同的是如果有相同的序號,那么接下來的序號不會間斷。也就是說如果兩個相同的行生成序號3,那么接下來生成的序號還是4。
NTILE (integer_expression) 按照指定的數(shù)目將數(shù)據(jù)進(jìn)行分組,并為每一組生成一個序號。
2.聚合開窗函數(shù)
很多聚合函數(shù)都可以用作窗口函數(shù)的運(yùn)算,如SUM,AVG,MAX,MIN。
聚合開窗函數(shù)只能使用PARTITION BY子句或都不帶任何語句,ORDER BY不能與聚合開窗函數(shù)一同使用。
例如,查詢雇員的定單總數(shù)及定單信息
- WITH- OrderInfo- AS
- (
- SELECT- COUNT- (OrderID) OVER(PARTITION- BY- EmployeeID)- AS- TotalCount,OrderID,CustomerID, EmployeeID,OrderDate- FROM- Orders (NOLOCK)
- )
- SELECT- OrderID,CustomerID, EmployeeID ,OrderDate,TotalCount- From- OrderInfo- ORDER- BY- EmployeeID
如果窗口函數(shù)不使用PARTITION BY 語句的話,那么就是不對數(shù)據(jù)進(jìn)行分組,聚合函數(shù)計算所有的行的值
- WITH- OrderInfo- AS
- (
- SELECT- COUNT- (OrderID) OVER()- AS- Count- ,OrderID,CustomerID, EmployeeID,OrderDate- FROM- Orders (NOLOCK)
- )
總結(jié)
以上所述是小編給大家介紹的Sql Server 開窗函數(shù)Over()的使用實(shí)例詳解,希望對大家有所幫助,
- SQL Server在分頁獲取數(shù)據(jù)的同時獲取到總記錄數(shù)的兩種
- SQL server數(shù)據(jù)庫高可用日志傳送的方法
- Sql Server 數(shù)據(jù)庫中調(diào)用dll文件的過程
- Sql Server 數(shù)據(jù)庫獲取字符串中小寫字母的SQL語句
- Sql Server數(shù)據(jù)庫如何去掉內(nèi)容里面的Html標(biāo)簽
- SQL Server數(shù)據(jù)庫遠(yuǎn)程更新目標(biāo)表數(shù)據(jù)的存儲過程
- MsSql 數(shù)據(jù)庫使用sqlplus創(chuàng)建DDL和DML操作方法
- SQL Server常見問題介紹及快速解決建議
- SQL Server中Table字典數(shù)據(jù)的查詢SQL示例代碼
- SQL SERVER 2012數(shù)據(jù)庫自動備份的方法
  - SQL Server在分頁獲取數(shù)據(jù)的同時獲取到總記錄數(shù)的兩種方法- 本文通過兩種方法給大家介紹SQL Server 在分頁獲取數(shù)據(jù)的同時獲取到總記錄數(shù),感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧。SQL Server 獲取數(shù)據(jù)的總記錄數(shù),有兩種方式:1.先分頁獲... 
  - SQL server數(shù)據(jù)庫高可用日志傳送的方法- SQL Server 使用日志傳送,您可以自動將“主服務(wù)器”實(shí)例上“主數(shù)據(jù)庫”內(nèi)的事務(wù)日志備份發(fā)送到單獨(dú)“輔助服務(wù)器”實(shí)例上的一個或多個“... 
  - Sql Server 數(shù)據(jù)庫中調(diào)用dll文件的過程- 文章主要介紹了Sql Server 數(shù)據(jù)庫中調(diào)用dll文件的過程,非常不錯,具有一定的參考借鑒價值,感興趣的朋友跟隨小編一起學(xué)習(xí)吧... 
  - Sql Server 數(shù)據(jù)庫獲取字符串中小寫字母的SQL語句- 文章主要介紹了SqlServer 獲取字符串中小寫字母的實(shí)現(xiàn)方法,非常不錯,具有一定的參考借鑒價值,需要的朋友跟隨腳本之家小編一起學(xué)習(xí)吧有時候我們會截取字符串中的一些特殊想要的... 
  - Sql Server數(shù)據(jù)庫如何去掉內(nèi)容里面的Html標(biāo)簽- 文章主要介紹了Sql Server 去掉內(nèi)容里邊的Html標(biāo)簽的實(shí)現(xiàn)方法,代碼超簡單,具有一定的參考借鑒價值,需要的朋友可以參考下。... 
  - SQL Server數(shù)據(jù)庫遠(yuǎn)程更新目標(biāo)表數(shù)據(jù)的存儲過程- 文章主要介紹了SQL Server 遠(yuǎn)程更新目標(biāo)表數(shù)據(jù)的存儲過程,適用于更新列名一致,主鍵為Int類型,具體實(shí)例代碼大家參考下本文本文給大家分享一個遠(yuǎn)程更新目標(biāo)庫數(shù)據(jù)的存儲過程,適用... 
  - MsSql 數(shù)據(jù)庫使用sqlplus創(chuàng)建DDL和DML操作方法- 文章主要介紹了使用sqlplus創(chuàng)建DDL和DML操作方法,需要的朋友可以參考下,在window進(jìn)入命令行模式敲sqlplus就會... 
  - SQL Server常見問題介紹及快速解決建議- 本文旨在幫助SQL Server數(shù)據(jù)庫的使用人員了解常見的問題,及快速解決這些問題。這些問題是數(shù)據(jù)庫的常規(guī)管理問題,對于很多對數(shù)據(jù)庫沒有深入了解的朋友提供一個大概的常見問題框架。... 
  - SQL Server中Table字典數(shù)據(jù)的查詢SQL示例代碼- 文章主要給大家介紹了關(guān)于SQL Server中Table字典數(shù)據(jù)的查詢SQL的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著... 
  - SQL SERVER 2012數(shù)據(jù)庫自動備份的方法- 文章主要為大家詳細(xì)介紹了SQL SERVER 2012數(shù)據(jù)庫自動備份的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下為了防止數(shù)據(jù)丟失,這里給大家介紹SQL SERVER2012數(shù)據(jù)自動備... 

