濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > sql server如何利用開(kāi)窗函數(shù)over()進(jìn)行分組統(tǒng)計(jì)

sql server如何利用開(kāi)窗函數(shù)over()進(jìn)行分組統(tǒng)計(jì)

熱門(mén)標(biāo)簽:濮陽(yáng)清豐400開(kāi)頭的電話(huà)申請(qǐng) 真3地圖標(biāo)注 疫情時(shí)期電話(huà)機(jī)器人 臺(tái)灣外呼系統(tǒng)軟件 地圖標(biāo)注跑線(xiàn)下市場(chǎng) 南京怎么申請(qǐng)400這種電話(huà) 地圖標(biāo)注可以編輯地名嗎 南通智能外呼系統(tǒng)怎么樣 樂(lè)昌電話(huà)機(jī)器人

這是一道常見(jiàn)的面試題,在實(shí)際項(xiàng)目中經(jīng)常會(huì)用到。

需求:求出以產(chǎn)品類(lèi)別為分組,各個(gè)分組里價(jià)格最高的產(chǎn)品信息。

實(shí)現(xiàn)過(guò)程如下:

declare @t table(
ProductID int,
ProductName varchar(20),
ProductType varchar(20),
Price int)

--測(cè)試數(shù)據(jù)

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

--做法一:找到每個(gè)組里,價(jià)格最大的值;然后再找出每個(gè)組里價(jià)格等于這個(gè)值的
--缺點(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)計(jì)信息計(jì)算出來(lái),然后直接篩選結(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() 的語(yǔ)法為:over([patition by ] order by >)。需要注意的是,over() 前面是一個(gè)函數(shù),如果是聚合函數(shù),那么order by 不能一起使用。
--over() 的另一常用情景是與 row_number() 一起用于分頁(yè)。

現(xiàn)在來(lái)介紹一下開(kāi)窗函數(shù)。

窗口函數(shù)OVER()指定一組行,開(kāi)窗函數(shù)計(jì)算從窗口函數(shù)輸出的結(jié)果集中各行的值。 

開(kāi)窗函數(shù)不需要使用GROUP BY就可以對(duì)數(shù)據(jù)進(jìn)行分組,還可以同時(shí)返回基礎(chǔ)行的列和聚合列。  

1.排名開(kāi)窗函數(shù)

ROW_NUMBER、DENSE_RANK、RANK、NTILE屬于排名函數(shù)。

排名開(kāi)窗函數(shù)可以單獨(dú)使用ORDER BY 語(yǔ)句,也可以和PARTITION BY同時(shí)使用。

PARTITION BY用于將結(jié)果集進(jìn)行分組,開(kāi)窗函數(shù)應(yīng)用于每一組。

ODER BY 指定排名開(kāi)窗函數(shù)的順序。在排名開(kāi)窗函數(shù)中必須使用ORDER BY語(yǔ)句。

例如查詢(xún)每個(gè)雇員的定單,并按時(shí)間排序

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語(yǔ)句按雇員ID對(duì)數(shù)據(jù)行分組,然后按照ORDER BY 語(yǔ)句排序,排名函數(shù)ROW_NUMBER()為每一組的數(shù)據(jù)分從1開(kāi)始生成一個(gè)序號(hào)。 

ROW_NUMBER()為每一組的行按順序生成一個(gè)唯一的序號(hào)

RANK()也為每一組的行生成一個(gè)序號(hào),與ROW_NUMBER()不同的是如果按照ORDER BY的排序,如果有相同的值會(huì)生成相同的序號(hào),并且接下來(lái)的序號(hào)是不連序的。例如兩個(gè)相同的行生成序號(hào)3,那么接下來(lái)會(huì)生成序號(hào)5。

DENSE_RANK()和RANK()類(lèi)似,不同的是如果有相同的序號(hào),那么接下來(lái)的序號(hào)不會(huì)間斷。也就是說(shuō)如果兩個(gè)相同的行生成序號(hào)3,那么接下來(lái)生成的序號(hào)還是4。

NTILE (integer_expression) 按照指定的數(shù)目將數(shù)據(jù)進(jìn)行分組,并為每一組生成一個(gè)序號(hào)。

2.聚合開(kāi)窗函數(shù)

很多聚合函數(shù)都可以用作窗口函數(shù)的運(yùn)算,如SUM,AVG,MAX,MIN。

聚合開(kāi)窗函數(shù)只能使用PARTITION BY子句或都不帶任何語(yǔ)句,ORDER BY不能與聚合開(kāi)窗函數(shù)一同使用。

例如,查詢(xún)雇員的定單總數(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 語(yǔ)句的話(huà),那么就是不對(duì)數(shù)據(jù)進(jìn)行分組,聚合函數(shù)計(jì)算所有的行的值。

WITH OrderInfo AS

(

 SELECT COUNT(OrderID) OVER() AS Count,OrderID,CustomerID, EmployeeID,OrderDate FROM Orders (NOLOCK)

)

以上就是本文的全部?jī)?nèi)容,希望大家可以學(xué)會(huì)sql server利用開(kāi)窗函數(shù)進(jìn)行分組統(tǒng)計(jì)的方法,謝謝大家的閱讀。

您可能感興趣的文章:
  • SQL中的開(kāi)窗函數(shù)詳解可代替聚合函數(shù)使用
  • Sql Server 開(kāi)窗函數(shù)Over()的使用實(shí)例詳解
  • SQL Server 2012 開(kāi)窗函數(shù)
  • Oracle數(shù)據(jù)庫(kù)中SQL開(kāi)窗函數(shù)的使用

標(biāo)簽:馬鞍山 河北 通遼 廣安 陜西 阿里 福建 南京

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《sql server如何利用開(kāi)窗函數(shù)over()進(jìn)行分組統(tǒng)計(jì)》,本文關(guān)鍵詞  sql,server,如何,利用,開(kāi)窗,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《sql server如何利用開(kāi)窗函數(shù)over()進(jìn)行分組統(tǒng)計(jì)》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于sql server如何利用開(kāi)窗函數(shù)over()進(jìn)行分組統(tǒng)計(jì)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    辽中县| 苗栗市| 榆中县| 伊金霍洛旗| 博乐市| 永胜县| 五台县| 西华县| 潜江市| 玉环县| 雅江县| 宽城| 栖霞市| 镇宁| 红桥区| 奉化市| 湾仔区| 天津市| 当阳市| 辽宁省| 铁岭市| 桦川县| 新蔡县| 霞浦县| 金湖县| 仙游县| 衢州市| 桦川县| 苍南县| 正镶白旗| 青阳县| 定南县| 平谷区| 高陵县| 博爱县| 丰原市| 南安市| 图木舒克市| 含山县| 河源市| 河曲县|