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