国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數據庫 > SQL Server > 正文

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

2020-07-25 11:51:58
字體:
來源:轉載
供稿:網友

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

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

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

SELECT FName, FCITY, FAGE, FSalary, COUNT(FName) FROM T_Person WHERE FSALARY<5000

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

         可以使用子查詢實現,語句:

SELECT FName, FCITY, FAGE, FSalary, ( SELECT COUNT(FName) FROM T_Person WHERE FSALARY<5000 ) PersonNum FROM T_Person WHERE FSALARY<5000

       結果:

     使用開窗函數實現,查詢結果一模一樣,就不粘貼了:

SELECT FName, FCITY, FAGE, FSalary, COUNT(FName) OVER() as PersonNum FROM T_Person WHERE FSALARY<5000

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

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

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

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

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

 

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

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

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

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

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

  按照薪水高低給所有人員排序,同樣薪水的排名不一樣,可以用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()將每個城市的薪水排行,值一樣的同一個排名,出現兩個第一名的時候,排在兩個第一名后的排名將是第三名

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

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

 

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

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

總結

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 乳山市| 大埔县| 溧阳市| 霍州市| 扎赉特旗| 武威市| 凤城市| 谢通门县| 开原市| 广饶县| 固镇县| 万安县| 双辽市| 兴安县| 万州区| 义乌市| 香港| 定陶县| 东源县| 石景山区| 犍为县| 彭水| 崇左市| 和静县| 利津县| 龙岩市| 兴仁县| 蒲城县| 娄底市| 水富县| 革吉县| 云南省| 绵阳市| 张家口市| 天气| 大悟县| 阿勒泰市| 山阳县| 昌吉市| 墨竹工卡县| 寿阳县|