好湿?好紧?好多水好爽自慰,久久久噜久噜久久综合,成人做爰A片免费看黄冈,机机对机机30分钟无遮挡

主頁 > 知識庫 > sql server如何利用開窗函數over()進行分組統計

sql server如何利用開窗函數over()進行分組統計

熱門標簽:濮陽清豐400開頭的電話申請 真3地圖標注 疫情時期電話機器人 臺灣外呼系統軟件 地圖標注跑線下市場 南京怎么申請400這種電話 地圖標注可以編輯地名嗎 南通智能外呼系統怎么樣 樂昌電話機器人

這是一道常見的面試題,在實際項目中經常會用到。

需求:求出以產品類別為分組,各個分組里價格最高的產品信息。

實現過程如下:

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利用開窗函數進行分組統計的方法,謝謝大家的閱讀。

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

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

巨人網絡通訊聲明:本文標題《sql server如何利用開窗函數over()進行分組統計》,本文關鍵詞  sql,server,如何,利用,開窗,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《sql server如何利用開窗函數over()進行分組統計》相關的同類信息!
  • 本頁收集關于sql server如何利用開窗函數over()進行分組統計的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 国产在线观看不卡一区二区三区| 日本洗澡偷窥在线观看| 偷窥丶亚洲丶少妇| 亚洲一日韩欧美熟妇中文字幕久久 | x8x8在线| 久久精品国产精品亚洲色婷婷老猫| 久久福利免费资源网站| 日产乱码精品一二三区| 午夜黄视频| 国产精品流白浆视频AV拍拍拍| 主播户外勾塔路人直播平台| 美女隐私视频黄www免费| 艹逼网址| 久久啪久久爱电影99pa| 中文字幕JUL-425汗流浃背| 国产孕交| 女人扒开腿让男生桶爽动漫| 啊啊啊好大好深| 宅男天堂一区二区久久久无码| 国产AV一区二区三区免费视频| 国产精品丝袜高跟鞋| 黑帮老大与我和我第365天2季| 欢颜| 双性皇帝大乳浪受噗呲噗呲h| 欧美熟妇另类交乱在线AV| 日韩免费高清大片在线| 在线看片你懂得| 91丝袜精品久久久久久无码人妻| 欧美free 性XXXX护士HD| 桃花直播app| 明星三级级在线电影| 日韩久久精品一区二区三区| 午夜十二点正片高清电影任达华| 欧美视频一区二区三区| 亚洲色图欧美偷拍| 6080午夜乱理伦片| 在线电影网址| 男人的天堂京热AV视频成人什社区| 強姦犯された人妻たち的编剧是谁 | 扒开双腿疯狂进出爽爽爽观看| 粗大灌满娇喘抽搐男男GV69|