Sql Server 開窗函數Over()的使用

利用over(),將統計信息計算出來,然后直接篩選結果集
 1 declare @t table(
 2 ProductID int,
 3 ProductName varchar(20),
 4 ProductType varchar(20),
 5 Price int)
 6  
 7 insert @t
 8 select 1,'name1','P1',3 union all
 9 select 2,'name2','P1',5 union all
10 select 3,'name3','P2',4 union all
11 select 4,'name4','P2',4

?

查詢要求:查出每類產品中價格最高的信息

--做法一:找到每個組里,價格最大的值;然后再找出每個組里價格等于這個值的
--缺點:要進行一次join
?? ?
select t1.* from @t t1join (select ProductType, max(Price) Price from @t group by ProductType) t2 on t1.ProductType = t2.ProductTypewhere t1.Price = t2.Priceorder 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 = MaxPriceorder 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))

?

轉載于:https://www.cnblogs.com/SmileIven/p/9109528.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/452480.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/452480.shtml
英文地址,請注明出處:http://en.pswp.cn/news/452480.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

云棲科技評論第48期:前沿科技對世界的改造 我們這代人只完成了1%

1、數字經濟版圖呈中美雙分趨勢 日本IT行業為前景擔憂 數字經濟版圖呈中美雙分趨勢 日本IT行業為前景擔憂 【新聞摘要】《日本經濟新聞》日前刊文稱&#xff0c;數字經濟的勢力版圖呈現中國和美國兩強雙分的趨勢明顯&#xff0c;這意味著日本可能不得不使用中美的技術&#xff…

程序員犯的非技術錯誤(Top 5)

對于程序開發者來說&#xff0c;有兩種技術需要我們掌握&#xff0c;一個是技術上的能力&#xff0c;另一個是非技術上的能力。不幸的是&#xff0c;許多程序員過多地關注了技術上的能力&#xff0c;而忽略了非技術上的能力的培養&#xff0c;因此&#xff0c;我們的程序員們經…

CentOS下添加Root權限用戶‘超級用戶’方法(xxx is not in the sudoers file.This incident will be reported.的解決方法)

文章目錄1.添加普通用戶2.添加sudo文件的寫權限3.編輯sudoers文件4.撤銷sudoers文件寫權限1.添加普通用戶 [rootserver ~]# useradd fxd //添加一個名為fxd的用戶 [rootserver ~]# passwd fxd //修改密碼 Changing password for user chenjiafa. New UNIX password: //在這里輸…

android打印intent flag,Android flag詳解

Android flag詳解Android flag詳解一.Flag標志位在閱讀源碼的時候經常發現有一些標志屬性使用一些位操作來判斷是否具有該標志&#xff0c;增加標志或者去除標志。如&#xff1a;二.addFlags (int flags)和setFlags (int flags)區別Public Intent addFlags (int flags)增加額外…

人機界面設計

1.系統響應時間 系統響應時間指從用戶完成某個控制動作(例如&#xff0c;按回車鍵或單擊鼠標)&#xff0c;到軟件給出預期的響應(輸出信息或做動作)之間的這段時間。 系統響應時間有兩個重要屬性&#xff0c;分別是長度和易變性。 1&#xff09;長度&#xff1a;時間過長&#…

GeoHash資料

geohash基本原理 轉載于:https://www.cnblogs.com/hyl8218/p/9111410.html

開啟市場新格局 且看新華三計算與存儲新品發布會

全球領先的新IT解決方案領導者新華三將于8月31日在北京釣魚臺國賓館舉辦“新IT 新動能 新格局 新華三下一代計算與存儲發布會”&#xff0c;重磅發布服務器和存儲的全線新品。 2017年初&#xff0c;新華三集團正式推出了“應用驅動 云領未來”的新IT戰略。在這一戰略指引下&…

Centos7更新 SQLite3至版本3.29.0

文章目錄1.創建 src 目錄并進到這個目錄2.下載 sqlite3 源碼并解壓安裝3.替換系統低版本 sqlite31.創建 src 目錄并進到這個目錄 fxd用戶下&#xff1a; mkdir -p ~/src cd ~/src 2.下載 sqlite3 源碼并解壓安裝 fxd用戶下&#xff1a; wget https://sqlite.org/2019/sqlite…

開發人員必學的5門課程

越來越多的Web開發人員通常都會問一些同樣的問題。比如&#xff1a;哪一種開發語言最重要&#xff1f;初級開發人員的薪金會是多少&#xff1f;公司提供的免費培訓有用嗎&#xff1f;如何評估一個新的項目&#xff1f;盡管這些問題都很重要&#xff0c;但是開發人員往往對其他人…

android 響應類型,android – Retrofit 2 RxJava – Gson – “全局”反序列化,更改響應類型...

正如Than所說,使用攔截器的解決方案并不是那么好.我已經設法用一個Rx變壓器來解決這個問題.我還添加了自定義api異常,當出現問題時我可以拋出它并在onError中輕松處理它.我認為它更強大.響應包裝器&#xff1a;public class ApiResponse {private boolean success;private T da…

龜兔賽跑問題

題目 烏龜與兔子進行賽跑&#xff0c;跑場是一個矩型跑道&#xff0c;跑道邊可以隨地進行休息。烏龜每分鐘可以前進3米&#xff0c;兔子每分鐘前進9米&#xff1b;兔子嫌烏龜跑得慢&#xff0c;覺得肯定能跑贏烏龜&#xff0c;于是&#xff0c;每跑10分鐘回頭看一下烏龜&#x…

過程設計的工具

描述程序處理過程的工具稱為過程設計工具&#xff0c;它可以分為圖形、表格和語言3類。不論是那類工具&#xff0c;對他們的基本要求都是提供對設計 無歧義的描述&#xff0c;也就是應該能夠指明控制流程、處理功能、數據組織以及其他方面的實現細節。從而在編碼階段能夠把對應…

Centos7中安裝python3.7、pip3以及pipenv(親測有效)

文章目錄1.安裝python3.7以及pip32.使用pip3安裝pipenv時pip報錯3.使用pip3安裝pipenv時出現ReadTimeoutError4.查看pipenv版本報錯1.安裝python3.7以及pip3 1)首先來安裝依賴 yum -y install gcc gcc-c yum -y groupinstall “Development tools” yum install openssl-deve…

成功人士都是這樣逼出來的

研究過很多很多成功人士的成才之路&#xff0c;發現這些人和我們普通人其實沒有什么區別&#xff0c;不過&#xff0c;這些人用老祖宗的話說是“天將降大任于斯人也&#xff0c;必將苦其心志&#xff0c;勞其筋骨&#xff0c;餓其體膚&#xff0c;空乏其身&#xff0c;所以動心…

Linux下網卡綁定模式

Linux bonding驅動一共提供了7種模式&#xff0c;它們分別是&#xff1a;balance-rr 、active-backup、balance-xor、broadcast、802.3ad、balance-tlb、balance-alb。 balance-rr or 0&#xff1a;輪詢模式&#xff0c;提供負載平衡和容錯。該模式下兩個網口都工作 active-…

Unity4.6證書激活問題

第一次運行的激活問題安裝好Unity4.6之后首次啟動會自動連網&#xff0c;但是會出現error loading page錯誤&#xff0c;SSL peer certificate or SSH remote key was not OK。如下圖所示&#xff1a; 點OK就退出了。再啟動一遍也是一樣的。 這時可以先暫時斷一下網&#xff0c…

Readhat中掛載yum源

文章目錄1.鏈接物理鏡像2.查看原始掛載目錄3.掛載4.新建iso.repo5.查看掛載目錄1.鏈接物理鏡像 vmware控制臺中&#xff0c;勾選設備狀態成“已連接”&#xff0c;會在桌面生成鏡像圖標。 2.查看原始掛載目錄 輸入以下指令&#xff1a; [rootlocalhost ~]# df -h Filesystem…

面向數據結構設計的基本思想

Jackson 方法的軟件設計過程是從數據結構入手&#xff0c;由數據結構之間的關系導出程序結構&#xff0c;這使軟件系統的開發“有章可循”。尤其這一方法特別適合于以數據為主&#xff0c;“計算”較簡單的數據處理系統。因此可稱其為“面向數據的方法”。由于這一技術未提供對…

html圖片分四面切割播,CSS3切割輪播圖

* {margin:0;padding:0;}.view {width:560px;height:300px;margin:200px auto;position:relative;}.box {width:100%;height:100%;list-style:none;background-color:black;position:absolute;/* 開啟3d效果 */transform-style:preserve-3d;}.box li {width:25%;height:100%;po…

知其所以然地學習(以算法學習為例)

其實下文的絕大部分內容對所有學習都是同理的。只不過最近在正兒巴經地學算法&#xff0c;而后者又不是好啃的骨頭&#xff0c;所以平時思考總結得就自然要比學其它東西要多一些。 問題&#xff1a;目前幾乎所有的算法書的講解方式都是歐幾里德式的、瀑布式的、自上而下的、每…