久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術(shù)文章
文章詳情頁

Oracle中ROW_NUMBER()OVER()函數(shù)用法實例講解

瀏覽:121日期:2023-05-30 16:13:50
目錄
  • 1. 說明:
  • 2. 原理:
  • 3.語法:
  • 4.示例一:
  • 5. 示例二
  • 總結(jié)

Oracle中ROW_NUMBER() OVER()函數(shù)用法

1. 說明:

ROW_NUMBER() OVER() 函數(shù)的作用:分組排序

2. 原理:

row_number() over() 函數(shù),over() 里的分組以及排序的執(zhí)行晚于 where、group by、order by 的執(zhí)行。

3.語法:

row_number() over( partition by 分組列 order by 排序列 desc )

4.示例一:

查詢表:SELECT * FROM SCOTT.EMP ;

使用Row_number() over() 函數(shù),排序

SELECT EMPNO,ENAME,SAL,DEPTNO,Row_number() over( order by sal) rs FROMSCOTT.EMP ;

根據(jù)工資排序并添加序號

5. 示例二

1.建立測試學(xué)生數(shù)據(jù)表

create table Students (id int,name varchar2(100),classid int,score int); insert into Students values(1, "學(xué)生1", 1, 88);insert into Students values(2, "學(xué)生2", 3, 68);insert into Students values(3, "學(xué)生3", 1, 78);insert into Students values(4, "學(xué)生4", 2, 87);insert into Students values(5, "學(xué)生5", 1, 89);insert into Students values(6, "學(xué)生6", 2, 91);insert into Students values(7, "學(xué)生7", 3, 67);insert into Students values(8, "學(xué)生8", 1, 77);insert into Students values(9, "學(xué)生9", 3, 77);commit;

2.查學(xué)生數(shù)據(jù)根據(jù)班級分組,再根據(jù)分數(shù)排名。獲取到每個班級的學(xué)生分數(shù)排名

select id, name, classid, score, row_number() over(partition by classid order by score desc) rank from Students;

3. 獲取到每個班級分數(shù)排名第一的學(xué)生

select * from (select id, name, classid, score, row_number() over(partition by classid order by score desc) rank from Students) where rank = 1;

重點說明:

  1. parttion by 是 Oracle 中分析性函數(shù)的一部分,用于給結(jié)果集進行分區(qū),它和聚合函數(shù) group by
    不同的地方在于它只是將原始數(shù)據(jù)進行名次排列,能夠返回一個分組中的多條記錄(記錄數(shù)不變),而 group by
    是對原始數(shù)據(jù)進行聚合統(tǒng)計,一般只有一條反映統(tǒng)計值的結(jié)果(每組返回一條)。
  2. over() 必須有 ORDER BY 語句
  3. 分組內(nèi)從 1開始排序
  4. over() 中的排序字段為空,會被排到第一

例如:

將學(xué)生1的分數(shù)設(shè)置為 null,再獲取到分組班級的學(xué)生分數(shù)排名

select id, name, classid, score, row_number() over(partition by classid order by score desc) rank from Students;

修改學(xué)生一在該班級的排序,分數(shù)最低排最后即可修正這個問題

select id, name, classid, score, row_number() over(partition by classid order by score desc nulls last) rank from Students;

2. 分析函數(shù)的例子二:

2.1 分析函數(shù)的形式:

分析函數(shù)帶有一個開窗函數(shù)over(),包含三個分析子句:分組(partition by),排序(order by), 窗口(rows),他們的使用形式如下:

over(partition by xxx order by yyy rows between zzz)– 例如在scott.emp表中:xxx為deptno, yyy為sal,– zzz為unbounded preceding and unbounded following

分析函數(shù)的例子:

顯示各部門員工的工資,并附帶顯示該部分的最高工資。

SQL如下:

SELECT DEPTNO, EMPNO, ENAME, SAL, LAST_VALUE(SAL) OVER (PARTITION BY DEPTNO ORDER BY SAL ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) MAX_SAL FROM EMP;

注: current row 表示當前行

unbounded preceding 表示第一行

unbounded following 表示最后一行

last_value(sal) 的結(jié)果與 order by sal 排序有關(guān)。如果排序為order by sal desc, 則最終的結(jié)果為分組排序后sal的最小值(分組排序后的最后一個值), 當deptno為10時,max_sal為1300

2.2 兩個order by 的執(zhí)行機制

分析函數(shù)是在整個SQL查詢結(jié)束后(SQL語句中的order by 的執(zhí)行比較特殊)再進行的操作,也就是說SQL語句中的order by也會影響分析函數(shù)的執(zhí)行結(jié)果:

兩者一致:如果SQL語句中的order by 滿足分析函數(shù)分析時要求的排序,那么SQL語句中的排序?qū)⑾葓?zhí)行,分析函數(shù)在分析時就不必再排序。
兩者不一致:如果SQL語句中的order by 不滿足分析函數(shù)分析時要求的排序,那么SQL語句中的排序?qū)⒆詈笤诜治龊瘮?shù)分析結(jié)束后執(zhí)行排序。

2.3 分析函數(shù)中的分組、排序、窗口

分析函數(shù)包含三個分析子句:分組(partition by)、排序(order by)、窗口(rows)。

窗口就是分析函數(shù)分析時要處理的數(shù)據(jù)范圍,就拿sum來說,它是sum窗口中的記錄而不是整個分組中的記錄。因此我們在想得到某個欄位的累計值時,我們需要把窗口指定到該分組中的第一行數(shù)據(jù)到當前行,如果你指定該窗口從該分組中的第一行到最后一行,那么該組中的每一個sum值都會一樣,即整個組的總和。

窗口子句中我們經(jīng)常用到指定第一行,當前行,最后一行這樣的三個屬性:

第一行是 unbounded preceding

當前行是 current row

最后一行是 unbounded following

窗口子句不能單獨出現(xiàn),必須有order by 子句時才能出現(xiàn),如:

LAST_VALUE(SAL) OVER (PARTITION BY DEPTNO ORDER BY SAL ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING )

以上示例指定窗口為整個分組.

而出現(xiàn)order by 子句的時候,不一定要有窗口子句,但效果會不一樣,此時窗口默認是當前組的第一行到當前行!

SQL語句為:

SELECT DEPTNO, EMPNO, ENAME, SAL,last_value(SAL) OVER(PARTITION BY DEPTNO ORDER BY SAL) MAX_SAL FROM EMP;

等價于:

SELECT DEPTNO, EMPNO, ENAME, SAL,last_value(SAL) OVER(PARTITION BY DEPTNO ORDER BY SAL ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) MAX_SAL FROM EMP;

結(jié)果如下圖:

當省略窗口子句時:

  • 如果存在order by, 則默認的窗口是 unbounded preceding and current row.
  • 如果同時省略order by, 則默認的窗口是 unbounded preceding and unbounded following.

如果省略分組,則把全部記錄當成一個組:

  • 如果存在order by 則默認窗口是unbounded preceding and current row
  • 如果這時省略order by 則窗口默認為 unbounded preceding and unbounded following

可參考:https://www.jb51.net/article/282335.htm

總結(jié)

到此這篇關(guān)于Oracle中ROW_NUMBER()OVER()函數(shù)用法的文章就介紹到這了,更多相關(guān)Oracle中ROW_NUMBER()OVER()函數(shù)內(nèi)容請搜索以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持!

標簽: Oracle
主站蜘蛛池模板: 国产成人在线免费观看 | 亚洲精品自在在线观看 | 国产羞羞视频在线观看 | 久久久久久综合 | 久久韩国| 天堂精品久久 | av毛片| 久久免费精品视频 | 成人免费在线视频观看 | 国产欧美综合一区 | 在线亚洲不卡 | 国产黄色在线观看 | 亚洲一区二区在线免费观看 | 国产精品丝袜一区二区 | 天天干天天看天天操 | 亚洲精品乱码久久久久久国产主播 | 久久久久久国产精品高清 | 亚洲成av| 91精品国产一区二区三区四区在线 | 国产伦精品一区二区三区照片91 | 国产v日产∨综合v精品视频 | 一级黄色片视频 | 欧洲美女7788成人免费视频 | 国产日韩免费 | 国产免费一区二区三区网站免费 | 国产精品原创av | 夜夜爽99久久国产综合精品女不卡 | a国产在线观看 | julia一区二区三区中文字幕 | 成人av观看 | 狠狠操综合网 | 亚州视频在线 | 美女福利视频 | 高清一区二区三区 | 久久精品一 | 日韩一区不卡 | 在线国v免费看 | 天堂中文资源在线 | 国产精品影院在线观看 | 一区二区三区在线免费观看 | 欧美日产国产成人免费图片 |