<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          SQL窗口函數(shù)OVER詳細(xì)用法,一學(xué)就會

          共 4093字,需瀏覽 9分鐘

           ·

          2020-12-26 10:27

          點擊關(guān)注上方“SQL數(shù)據(jù)庫開發(fā)”,

          設(shè)為“置頂或星標(biāo)”,第一時間送達(dá)干貨

          OVER的定義

          OVER用于為行定義一個窗口,它對一組值進行操作,不需要使用GROUP BY子句對數(shù)據(jù)進行分組,能夠在同一行中同時返回基礎(chǔ)行的列和聚合列。


          OVER的語法

          OVER (?[ PARTITION BY?column ]?[ ORDER BY culumn ]?)

          PARTITION BY 子句進行分組;

          ORDER BY 子句進行排序。

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

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


          OVER的用法

          OVER開窗函數(shù)必須與聚合函數(shù)或排序函數(shù)一起使用,聚合函數(shù)一般指SUM(),MAX(),MIN,COUNT(),AVG()等常見函數(shù)。排序函數(shù)一般指RANK(),ROW_NUMBER(),DENSE_RANK(),NTILE()等。


          OVER在聚合函數(shù)中使用的示例

          我們以SUM和COUNT函數(shù)作為示例來給大家演示。

          --建立測試表和測試數(shù)據(jù)
          CREATE?TABLE?Employee
          (
          ID?INT??PRIMARY KEY,
          Name?VARCHAR(20),
          GroupName VARCHAR(20),
          Salary INT
          )
          INSERT?INTO??Employee
          VALUES(1,'小明','開發(fā)部',8000),
          ??????(4,'小張','開發(fā)部',7600),
          ??????(5,'小白','開發(fā)部',7000),
          ??????(8,'小王','財務(wù)部',5000),
          ??????(9, null,'財務(wù)部',NULL),
          ??????(15,'小劉','財務(wù)部',6000),
          ??????(16,'小高','行政部',4500),
          ??????(18,'小王','行政部',4000),
          ??????(23,'小李','行政部',4500),
          ??????(29,'小吳','行政部',4700);


          SUM后的開窗函數(shù)

          SELECT?*,
          ?????SUM(Salary) OVER(PARTITION?BY?Groupname) 每個組的總工資,
          ?????SUM(Salary) OVER(PARTITION?BY?groupname ORDER?BY?ID) 每個組的累計總工資,
          ?????SUM(Salary) OVER(ORDER?BY?ID) 累計工資,
          ?????SUM(Salary) OVER() 總工資
          from?Employee

          (提示:可以左右滑動代碼)

          結(jié)果如下:

          其中開窗函數(shù)的每個含義不同,我們來具體解讀一下:

          SUM(Salary) OVER (PARTITION BY Groupname)

          只對PARTITION BY后面的列Groupname進行分組,分組后求解Salary的和。

          SUM(Salary)?OVER (PARTITION BY Groupname?ORDER BY ID)

          對PARTITION BY后面的列Groupname進行分組,然后按ORDER BY 后的ID進行排序,然后在組內(nèi)對Salary進行累加處理。

          SUM(Salary)?OVER (ORDER BY ID)

          只對ORDER BY 后的ID內(nèi)容進行排序,對排完序后的Salary進行累加處理。

          SUM(Salary)?OVER ()

          對Salary進行匯總處理


          COUNT后的開窗函數(shù)

          SELECT?*,
          ???????COUNT(*) OVER(PARTITION?BY?Groupname ) 每個組的個數(shù),
          ???????COUNT(*) OVER(PARTITION?BY?Groupname ORDER?BY?ID) 每個組的累積個數(shù),
          ???????COUNT(*) OVER(ORDER?BY?ID) 累積個數(shù) ,
          ???????COUNT(*) OVER() 總個數(shù)
          from?Employee

          返回的結(jié)果如下圖:

          后面的每個開窗函數(shù)就不再一一解讀了,可以對照上面SUM后的開窗函數(shù)進行一一對照。


          OVER在排序函數(shù)中使用的示例

          我們對4個排序函數(shù)一一演示

          --先建立測試表和測試數(shù)據(jù)
          WITH t AS
          (SELECT?1?StuID,'一班'?ClassName,70?Score
          UNION?ALL
          SELECT?2,'一班',85
          UNION?ALL
          SELECT?3,'一班',85
          UNION?ALL
          SELECT?4,'二班',80
          UNION?ALL
          SELECT?5,'二班',74
          UNION?ALL
          SELECT?6,'二班',80
          )
          SELECT?* INTO?Scores FROM?t;
          SELECT?* FROM?Scores


          ROW_NUMBER()

          定義:ROW_NUMBER()函數(shù)作用就是將SELECT查詢到的數(shù)據(jù)進行排序,每一條數(shù)據(jù)加一個序號,他不能用做于學(xué)生成績的排名,一般多用于分頁查詢,比如查詢前10個 查詢10-100個學(xué)生。ROW_NUMBER()必須與ORDER BY一起使用,否則會報錯。?


          對學(xué)生成績排序

          SELECT?*,
          ROW_NUMBER() OVER?(PARTITION?BY?ClassName ORDER?BY?SCORE DESC) 班內(nèi)排序,
          ROW_NUMBER() OVER?(ORDER?BY?SCORE DESC) AS?總排序
          FROM?Scores;

          結(jié)果如下:

          這里的PARTITION BY和ORDER BY的作用與我們在上面看到的聚合函數(shù)的作用一樣,都是用來進行分組和排序使用的。


          此外ROW_NUMBER()函數(shù)還可以取指定順序的數(shù)據(jù)。

          SELECT?* FROM?( 
          SELECT?*, ROW_NUMBER() OVER?(ORDER?BY?SCORE DESC) AS?總排序
          FROM?Scores
          ) t WHERE?t.總排序=2;

          結(jié)果如下:


          RANK()?

          定義:RANK()函數(shù),顧名思義排名函數(shù),可以對某一個字段進行排名,這里和ROW_NUMBER()有什么不一樣呢?ROW_NUMBER()是排序,當(dāng)存在相同成績的學(xué)生時,ROW_NUMBER()會依次進行排序,他們序號不相同,而Rank()則不一樣。如果出現(xiàn)相同的,他們的排名是一樣的。下面看例子:


          示例

          SELECT?ROW_NUMBER() OVER?(ORDER?BY?SCORE DESC) AS?[RANK],*
          FROM?Scores;

          SELECT?RANK() OVER?(ORDER?BY?SCORE DESC) AS?[RANK],*
          FROM?Scores;


          結(jié)果:

          其中上圖是ROW_NUMBER()的結(jié)果,下圖是RANK()的結(jié)果。當(dāng)出現(xiàn)兩個學(xué)生成績相同是里面出現(xiàn)變化。RANK()是1-1-3-3-5-6,而ROW_NUMBER()則還是1-2-3-4-5-6,這就是RANK()和ROW_NUMBER()的區(qū)別了。


          DENSE_RANK()?

          定義:DENSE_RANK()函數(shù)也是排名函數(shù),和RANK()功能相似,也是對字段進行排名,那它和RANK()到底有什么不同那?特別是對于有成績相同的情況,DENSE_RANK()排名是連續(xù)的,RANK()是跳躍的排名,一般情況下用的排名函數(shù)就是RANK() 我們看例子:


          示例

          SELECT?
          RANK() OVER?(ORDER?BY?SCORE DESC) AS?[RANK],*
          FROM?Scores;

          SELECT?
          DENSE_RANK() OVER?(ORDER?BY?SCORE DESC) AS?[RANK],*
          FROM?Scores;

          結(jié)果如下:


          上面是RANK()的結(jié)果,下面是DENSE_RANK()的結(jié)果


          NTILE()

          定義:NTILE()函數(shù)是將有序分區(qū)中的行分發(fā)到指定數(shù)目的組中,各個組有編號,編號從1開始,就像我們說的'分區(qū)'一樣 ,分為幾個區(qū),一個區(qū)會有多少個。??

          SELECT?*,NTILE(1) OVER?(ORDER?BY?SCORE DESC) AS?分區(qū)后排序 FROM?Scores;

          SELECT?*,NTILE(2) OVER?(ORDER?BY?SCORE DESC) AS?分區(qū)后排序 FROM?Scores;

          SELECT?*,NTILE(3) OVER?(ORDER?BY?SCORE DESC) AS?分區(qū)后排序 FROM?Scores;

          結(jié)果如下:


          就是將查詢出來的記錄根據(jù)NTILE函數(shù)里的參數(shù)進行平分分區(qū)。


          總結(jié)

          OVER開窗函數(shù)是我們工作中經(jīng)常要使用到的,特別是在做數(shù)據(jù)分析計算的時候,經(jīng)常要對數(shù)據(jù)進行分組排序。上面我們額外介紹了聚合函數(shù)和排序函數(shù)的與OVER結(jié)合的使用方法,此外還有很多與OVER一起使用的函數(shù),比如LEAD函數(shù),LAG函數(shù),STRING_AGG函數(shù)等等都會使用到開窗函數(shù)OVER,其使用方法也要務(wù)必掌握。


          我是岳哥,最后給大家分享我寫的SQL兩件套:《SQL基礎(chǔ)知識第二版》《SQL高級知識第二版》的PDF電子版。里面有各個語法的解釋、大量的實例講解和批注等等,非常通俗易懂,方便大家跟著一起來實操。


          有需要的讀者可以下載學(xué)習(xí),在下面的公眾號「數(shù)據(jù)前線」(非本號)后臺回復(fù)關(guān)鍵字:SQL,就行

          數(shù)據(jù)前線
          ——End——

          后臺回復(fù)關(guān)鍵字:1024,獲取一份精心整理的技術(shù)干貨

          后臺回復(fù)關(guān)鍵字:進群,帶你進入高手如云的交流群。

          推薦閱讀

          瀏覽 50
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  看欧美黄色片 | 中文无码观看 | 抄逼电影观看 | 99这里只有精品 | 国产伦理,久久做,天天做 |