濮阳杆衣贸易有限公司

主頁 > 知識庫 > SQL中的開窗函數(shù)詳解可代替聚合函數(shù)使用

SQL中的開窗函數(shù)詳解可代替聚合函數(shù)使用

熱門標簽:外呼系統(tǒng)電銷專用 怎樣在地圖上標注路線圖標 千呼電銷機器人價格 奧威地圖標注多個地方 京華物流公司地圖標注 優(yōu)質地圖標注 智能語音外呼系統(tǒng)選哪家 百度地圖標注不同路線 武漢長沙外呼系統(tǒng)方法和技巧

 在沒學習開窗函數(shù)之前,我們都知道,用了分組之后,查詢字段就只能是分組字段和聚合的字段,這帶來了極大的不方便,有時我們查詢時需要分組,又需要查詢不分組的字段,每次都要又到子查詢,這樣顯得sql語句復雜難懂,給維護代碼的人帶來很大的痛苦,然而開窗函數(shù)出現(xiàn)了,曙光也來臨了。如果要想更具體了解開窗函數(shù),請看書《程序員的SQL金典》,開窗函數(shù)在mysql不能使用。

       開窗函數(shù)與聚合函數(shù)一樣,都是對行的集合組進行聚合計算。它用于為行定義一個窗口(這里的窗口是指運算將要操作的行的集合),它對一組值進行操作,不需要使用group by語句對數(shù)據(jù)進行分組,能夠在同一行中同時返回基礎行的列和聚合列。定義看不懂不要緊,會用就行。

       舉個簡單例子 查詢每個工資小于5000的員工信息(姓名,城市 年齡 薪水),并且顯示小于5000的員工個數(shù),嘗試使用下面語句:

SELECT FName, FCITY, FAGE, FSalary, COUNT(FName) FROM T_Person WHERE FSALARY5000

消息 8120,級別 16,狀態(tài) 1,第 1 行
選擇列表中的列 'T_Person.FName' 無效,因為該列沒有包含在聚合函數(shù)或 GROUP BY 子句中。

         可以使用子查詢實現(xiàn),語句:

SELECT FName, FCITY, FAGE, FSalary, ( SELECT COUNT(FName) FROM T_Person WHERE FSALARY5000 ) PersonNum FROM T_Person 
WHERE FSALARY5000

       結果:

     使用開窗函數(shù)實現(xiàn),查詢結果一模一樣,就不粘貼了:

SELECT FName, FCITY, FAGE, FSalary, COUNT(FName) OVER() as PersonNum FROM T_Person 
WHERE FSALARY5000

1.開窗函數(shù)格式:函數(shù)名(列) OVER(選項)

2.聚合開窗函數(shù)格式:聚合函數(shù)(列) OVER(PARTITION BY 字段)

      over關鍵字把聚合函數(shù)當成聚合開窗函數(shù)而不是聚合函數(shù),SQL標準允許將所有的聚合函數(shù)用做聚合開窗函數(shù)。OVER關鍵字后的括號中還經常添加選項用以改變進行聚合運算的窗口范圍。如果OVER關鍵字后的括號為空,則開窗函數(shù)會對結果集合的所有行進行聚合運算。

      PARTITION BY來定義行的分區(qū)來進行聚合運算,與group by 不同,partition by 字句創(chuàng)建的分區(qū)是獨立于結果集的,創(chuàng)建的分區(qū)只是用于進行聚合運算,而且不同的開窗函數(shù)所創(chuàng)建的分區(qū)不互相影響,例如:查詢所有人員的信息,并查詢所屬城市的人員數(shù)以及同年齡的人員數(shù):

SELECT FName,FCITY, FAGE, FSalary, COUNT(FName) OVER(PARTITION BY FCITY) CityNum, 
COUNT(FName) OVER(PARTITION BY FAGE) AgeNum FROM T_Person ORDER by FCITY

 

查詢所有人員的信息,并查詢所屬城市的人員數(shù),每個城市的人按照年齡排序語句:

SELECT FName,FCITY, FAGE, FSalary, COUNT(FName) OVER(PARTITION BY FCITY ORDER BY FAGE) CityNum FROM T_Person 

 3.排序開窗函數(shù)格式:排序函數(shù)() OVER(ORDER BY 字段)

  (1)主要函數(shù)有ROW_NUMBER()、RANK()、DENSE_RANK()、NTILE()

   ROW_NUMBER() 加行號,一般可以用于分頁查詢(現(xiàn)在被offset  fetch取代 ),對于沒有主鍵列的表加行號作用很明顯,刪除重復數(shù)據(jù)等。

  按照薪水高低給所有人員排序,同樣薪水的排名不一樣,可以用row_number(),

with a as 
(
SELECT FName, FSalary, FCity, FAge, ROW_NUMBER() over(ORDER BY FSalary) as RowNum FROM T_Person 
)
SELECT * FROM a 

 使用rank()將每個城市的薪水排行,值一樣的同一個排名,出現(xiàn)兩個第一名的時候,排在兩個第一名后的排名將是第三名

SELECT FName, FSalary, FCity, FAge, RANK() over(PARTITION BY FCITY ORDER BY FSalary) as RankNum FROM T_Person 

  使用dense_rank()將每個城市的薪水排行,值一樣的同一個排名,出現(xiàn)兩個第一名的時候,排在兩個第一名后的排名將是第三名

 

ntile(數(shù)字) over(order by 字段):數(shù)字表示一組多少個數(shù),并根據(jù)數(shù)量得出分組的數(shù)量

SELECT *,NTILE(5) OVER(ORDER BY FSalary) AS NileNum FROM T_Person

總結

到此這篇關于SQL中的開窗函數(shù)詳解可代替聚合函數(shù)使用的文章就介紹到這了,更多相關SQL 開窗函數(shù)內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Sql Server 開窗函數(shù)Over()的使用實例詳解
  • SQL Server 2012 開窗函數(shù)
  • sql server如何利用開窗函數(shù)over()進行分組統(tǒng)計
  • Oracle數(shù)據(jù)庫中SQL開窗函數(shù)的使用

標簽:來賓 銅仁 威海 防疫戰(zhàn)設 天水 益陽 宿州 七臺河

巨人網絡通訊聲明:本文標題《SQL中的開窗函數(shù)詳解可代替聚合函數(shù)使用》,本文關鍵詞  SQL,中的,開窗,函數(shù),詳解,;如發(fā)現(xiàn)本文內容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內容系統(tǒng)采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《SQL中的開窗函數(shù)詳解可代替聚合函數(shù)使用》相關的同類信息!
  • 本頁收集關于SQL中的開窗函數(shù)詳解可代替聚合函數(shù)使用的相關信息資訊供網民參考!
  • 推薦文章
    通河县| 泊头市| 杂多县| 大荔县| 沾益县| 汉沽区| 广元市| 兴文县| 宁化县| 法库县| 大港区| 祁东县| 宁陕县| 常熟市| 勐海县| 五大连池市| 综艺| 股票| 榆树市| 灵丘县| 甘孜县| 闽侯县| 广宁县| 昌宁县| 裕民县| 共和县| 葫芦岛市| 文化| 西乡县| 香格里拉县| 云南省| 镇平县| 东港市| 龙山县| 安平县| 巫溪县| 涿州市| 莲花县| 襄城县| 京山县| 丽江市|