rank()over 函數的使用

1. over()是分析函數,可以和rank()函數配合使用,也可以和其他函數配合使用。
取每個學科排名前三的分數,sql語句如下:
select * from (select rank() over(partition by subject order by mark desc) rk,S.* from S) T 
where T.rk<=3;

排列(rank())函數。這些排列函數提供了定義一個集合(使用 PARTITION 子句),然后根據某種排序方式對這個集合內的元素進行排列的能力,下面以scott用戶的emp表為例來說明rank over partition如何使用

1)查詢員工薪水并連續求和

select deptno,ename,sal,

sum(sal)over(order by ename) sum1, /*表示連續求和*/
sum(sal)over() sum2, /*相當于求和sum(sal)*/
100* round(sal/sum(sal)over(),4) "bal%"
from emp

結果如下:

DEPTNO ENAME SAL SUM1 SUM2 bal%
---------- ---------- ---------- ---------- ---------- ----------
20 ADAMS 1100 1100 29025 3.79
30 ALLEN 1600 2700 29025 5.51
30 BLAKE 2850 5550 29025 9.82
10 CLARK 2450 8000 29025 8.44
20 FORD 3000 11000 29025 10.34
30 JAMES 950 11950 29025 3.27
20 JONES 2975 14925 29025 10.25
10 KING 5000 19925 29025 17.23
30 MARTIN 1250 21175 29025 4.31
10 MILLER 1300 22475 29025 4.48
20 SCOTT 3000 25475 29025 10.34

DEPTNO ENAME SAL SUM1 SUM2 bal%
---------- ---------- ---------- ---------- ---------- ----------
20 SMITH 800 26275 29025 2.76
30 TURNER 1500 27775 29025 5.17
30 WARD 1250 29025 29025 4.31

2)如下:

select deptno,ename,sal,
sum(sal)over(partition by deptno order by ename) sum1,/*表示按部門號分區,按姓名排序并連續求和*/
sum(sal)over(partition by deptno) sum2,/*表示部門分區,求和*/
sum(sal)over(partition by deptno order by sal) sum3,/*按部門分區,按薪水排序并連續求和*/
100* round(sal/sum(sal)over(),4) "bal%"
from emp

結果如下:

DEPTNO ENAME SAL SUM1 SUM2 SUM3 bal%
---------- ---------- ---------- ---------- ---------- ---------- ----------
10 CLARK 2450 2450 8750 3750 8.44
10 KING 5000 7450 8750 8750 17.23
10 MILLER 1300 8750 8750 1300 4.48
20 ADAMS 1100 1100 10875 1900 3.79
20 FORD 3000 4100 10875 10875 10.34
20 JONES 2975 7075 10875 4875 10.25
20 SCOTT 3000 10075 10875 10875 10.34
20 SMITH 800 10875 10875 800 2.76
30 ALLEN 1600 1600 9400 6550 5.51
30 BLAKE 2850 4450 9400 9400 9.82
30 JAMES 950 5400 9400 950 3.27

DEPTNO ENAME SAL SUM1 SUM2 SUM3 bal%
---------- ---------- ---------- ---------- ---------- ---------- ----------
30 MARTIN 1250 6650 9400 3450 4.31
30 TURNER 1500 8150 9400 4950 5.17
30 WARD 1250 9400 9400 3450 4.31

3)如下:

select empno,deptno,sal,
sum(sal)over(partition by deptno) "deptSum",/*按部門分區,并求和*/
rank()over(partition by deptno order by sal desc nulls last) rank, /*按部門分區,按薪水排序并計算序號*/
dense_rank()over(partition by deptno order by sal desc nulls last) d_rank,
row_number()over(partition by deptno order by sal desc nulls last) row_rank
from emp

注:

rank()涵數主要用于排序,并給出序號

dense_rank():功能同rank()一樣,區別在于,rank()對于排序并的數據給予相同序號,接下來的數據序號直接跳中躍,dense_rank()則不是,比如數據:1,2,2,4,5,6.。。。。這是rank()的形式

1,2,2,3,4,5,。。。。這是dense_rank()的形式

1,2,3,4,5,6.。。。。。這是row_number()涵數形式

row_number()涵數則是按照順序依次使用,相當于我們普通查詢里的rownum值

其實從上面三個例子當中,不難看出over(partition by ... order by ...)的整體概念,我理解是

partition by :按照指字的字段分區,如果沒有則針對全體數據

order by :按照指定字段進行連續操作(如求和(sum),排序(rank()等),如果沒有指定,就相當于對指定分區集合內的數據進行整體sum操作

oracle聚合函數rank()的用法

SQL> select * from test_a;

ID PLAYNAME SCORE

-------------------- -------------------- ----------

01 aa 100

02 aa 101

02 bb 99

03 bb 98

04 aa 101

02 aa 101

需求是,將score降序排序,打印所有字段,并且如果是同一個playname的score只取出最高分,如果這個playname獲得過多個相同的最高分,則只取出其中一個(比如:aa獲得過3次101,則只取其中一個),最終要的結果就是:

RK ID PALYNAME SCORE

---------- -------------------- -------------------- ----------

1 02 aa 101

1 02 bb 99

本來我想用max函數,結果直接就出來了:

SQL> select max(score),palyname from test_a group by palyname;

MAX(SCORE) PALYNAME

---------- --------------------

101 aa

99 bb

但是要打印所有字段?OTL

即使用了嵌套,還是無法解決重復重現最高分的現象:

SQL> select distinct * from test_a t where score in (select max(score) from test_a group by palyname) order by score desc;

ID PALYNAME SCORE

-------------------- -------------------- ----------

02 aa 101

04 aa 101

02 bb 99

由于相同的playname對應的id不同,所以用distinct也無法過濾掉相同playname的并列最高分。

于是只好用rank()了

Rank的基本語法為:

RANK ( ) OVER ( [query_partition_clause] order_by_clause )

例子1:

  

  TABLE:A (科目,分數)

  

  數學,80

  語文,70

  數學,90

  數學,60

  數學,100

  語文,88

  語文,65

  語文,77

  

  現在我想要的結果是:(即想要每門科目的前3名的分數)

  

  數學,100

  數學,90

  數學,80

  語文,88

  語文,77

  語文,70

  

  那么語句就這么寫:

  

  select * from (select rank() over(partition by 科目 order by 分數 desc) rk,a.* from a) t

where t.rk<=3;

以科目來分組,然后以分數來排序,給排序的結果分配rank,取前三名的rank

例子2:

  

  有表Table內容如下

  

  COL1 COL2

    1 1

    2 1

    3 2

    3 1

    4 1

    4 2

    5 2

    5 2

    6 2

  

  分析功能:列出Col2分組后根據Col1排序,并生成數字列。比較實用于在成績表中查出各科前幾名的信息。

  

  SELECT a.*,RANK() OVER(PARTITION BY col2 ORDER BY col1) "Rank" FROM table a;

  

  結果如下:

  

  COL1 COL2 Rank

    1 1   1

    2 1   2

    3 1   3

    4 1   4

    3 2   1

    4 2   2

    5 2   3

    5 2   3

    6 2   5

這個例子更直觀一點,根據col2分組,根據clo1排序,我們可以發現:

5 2   3

5 2   3

6 2   5

即,如果兩行記錄完全相同,他們會被給予相同的rank,而排在它們之后的那行記錄,由于前面的并列第3,使得之后的那條記錄變成了第5,而如果我們在這里用的是dense_rank,那么之后的那條會變成第4

例子3:

  

  合計功能:計算出數值(4,1)在Orade By Col1,Col2排序下的排序值,也就是col1=4,col2=1在排序以后的位置

  

  SELECT RANK(4,1) WITHIN GROUP (ORDER BY col1,col2) "Rank" FROM table;

  

  結果如下:

  Rank

  4

通過以上方法,得出col1為4,col2為1的那行數據的rank排名為多少

Dense_rank的例子:

dense_rank與rank()用法相當,但是有一個區別:dence_rank在并列關系是,相關等級不會跳過。rank則跳過

  

  例如:表

  

  A      B      C

  a     liu     wang

  a     jin     shu

  a     cai     kai

  b     yang     du

  b     lin     ying

  b     yao     cai

  b     yang     99

  

  例如:當rank時為:

  

  select m.a,m.b,m.c,rank() over(partition by a order by b) liu from test3 m

  

   A     B       C     LIU

   a     cai      kai     1

   a     jin      shu     2

   a     liu      wang     3

   b     lin      ying     1

   b     yang     du      2

   b     yang     99      2

   b     yao      cai     4

  

  而如果用dense_rank時為:

  

  select m.a,m.b,m.c,dense_rank() over(partition by a order by b) liu from test3 m

  

   A     B       C     LIU

   a     cai     kai      1

   a     jin     shu      2

   a     liu     wang     3

   b     lin     ying     1

   b     yang     du      2

   b     yang     99      2

   b     yao     cai      3

那么再回到之前的那個需求,

SQL> select distinct * from (select rank() over(partition by playname order by score desc,id) rk,t.* from test_a t) where rk=1;

RK ID PLAYNAME SCORE

---------- -------------------- -------------------- ----------

1 02 aa 101

1 02 bb 99

這里order by score desc,id 以score降序和id這兩個字段排序,也就是說,正因為相同的playname對應的id不同,這樣相同的playname,相同的score,但是不同的id,這樣的2行數據就獲得了不同的rank,而rk=1,即是只取rank=1,也就是最高分。這樣就完成了需求。



轉載于:https://www.cnblogs.com/ilxx1988/p/5579753.html

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

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

相關文章

天梯賽2016-L2

L2-001. 緊急救援 作為一個城市的應急救援隊伍的負責人&#xff0c;你有一張特殊的全國地圖。在地圖上顯示有多個分散的城市和一些連接城市的快速道路。每個城市的救援隊數量和每一條連接兩個城市的快速道路長度都標在地圖上。當其他城市有緊急求助電話給你的時候&#xff0c;你…

伺服系統控制網絡的重要性! 現場總線的重要性! SSCNET運動控制系統與發展趨勢

引言&#xff1a;在2010年的時候&#xff0c;在北京的一個數控公司工作。產品采用的是通過運動控制卡發脈沖的方式&#xff0c;控制機床的X、Y、Z軸進行加工。 機床在加工產品的時候&#xff0c;一直存在著精度的問題&#xff0c;例如DMG的機床可以達到0.01的加工精度&#x…

apache配置

wamp環境安裝需要VC運行庫的支持 apache如果需要外網訪問&#xff0c;在其配置文件中尋找127.0.0.1然后替換為all 外網訪問需要關閉防火墻&#xff1f;轉載于:https://www.cnblogs.com/gremlin/p/5581486.html

TCP/IP 通信示例

TCP/IP 通信示例 Global String ReadData_P_All$, ReadData_P$(10), data$ Global Preserve Double x Global Integer foundnumber_PFunction TCPServerSetNet #201, "192.168.0.1", 4000, CRLF, NONE, 0OpenNet #201 As ClientWaitNet #201Print "TCP Connect…

MySQL分庫分表總結參考

單庫單表 單庫單表是最常見的數據庫設計&#xff0c;例如&#xff0c;有一張用戶(user)表放在數據庫db中&#xff0c;所有的用戶都可以在db庫中的user表中查到。 單庫多表 隨著用戶數量的增加&#xff0c;user表的數據量會越來越大&#xff0c;當數據量達到一定程度的時候對u…

小兔伴伴家庭動物園AR智能早教產品上市

2016年6月&#xff0c;經過樂卓大家庭所有人的共同努力&#xff0c;公司旗下首款新品——小兔伴伴之《家庭動物園》3D智能學習卡正式面世。 每個孩子都應該在合適的時間去體驗豐富的聲音、色彩和動作&#xff0c;《家庭動物園》&#xff0c;專為2-6歲兒童貼心設計&#xff0c;是…

EPSON 自帶CCD圖像處理包使用舉例

EPSON 機器人可以購買CCD圖像處理包選項&#xff0c;CCD圖像處理包與SPEL語言高度結合&#xff0c;可以非常快的將項目投入應用&#xff0c;舉例說明CCD圖像處理包與SPEL的聯合使用。 EPSON 以視覺序列定義圖像處理的一個項目&#xff0c;視覺序列是一組按照特定順序排列的視覺…

索引使用原則

前兩篇文章我總結了一些SQL數據庫索引的問題&#xff0c;這篇主要來分析下索引的優缼點&#xff0c;以及如何正確使用索引。 索引的優點&#xff1a;這個顯而易見&#xff0c;正確的索引會大大提高數據查詢&#xff0c;對結果進行排序、分組的操作效率。 索引的缺點…

根據時間變換頁面背景

1.概述 有些時侯為了豐富頁面的顯示效果&#xff0c;將頁面制作成根據時間變換頁面背景的樣式&#xff0c;這樣會使瀏覽者對此網站不會感覺厭倦&#xff0c;同時也會覺得網站制作的非常新穎。本實例通過Date對象的getHours()方法獲得當前系統時間的小時&#xff0c;然后根據不同…

EPSON 自帶CCD圖像處理包的典型應用框架

EPSON 自帶CCD圖像處理包的典型應用框架 Function main ******************************************** Very important statement below: Use the * //非常重要的是在實際運行時&#xff0c;用合適的Z數值代替預定義的 ZHeight 。Z height which you wrote down earlier in *…

EPSON 利用CCD圖像處理包標定工具坐標系

EPSON 利用CCD圖像處理包標定工具坐標系 仰視式安裝的相機可以用來計算工具偏移&#xff0c;下例使用仰視式相機來計算工具偏移。該功能首先運行一個序列來定位工具的尖端。然后計算出工具偏移&#xff08;前提是CCD已標定&#xff09;。 Function CalcTool Boolean foundReal…

掛馬方式研究、掛馬檢測技術研究

1. 掛馬定義 所謂的掛馬&#xff0c;就是黑客通過各種手段&#xff0c;包括SQL注入&#xff0c;網站敏感文件掃描&#xff0c;服務器漏洞&#xff0c;網站程序0day, 等各種方法獲得網站管理員賬號&#xff0c;然后登陸網站后臺&#xff0c;通過數據庫"備份/恢復"或者…

大幅面多相機高精度定位及測量解決方案

隨著機器視覺應用的日益廣泛&#xff0c;大幅面多相機視覺系統的需求越來越多&#xff0c;主要應用方向為大幅面高精度的定位與測量和場景拼接等。多相機視覺系統的難點在于多相機坐標系的統一&#xff0c;可以分為兩類&#xff0c;一是相機視野間無重疊部分&#xff0c;二是相…

Hadoop 使用FileSystem API 讀取數據

代碼&#xff1a; package com.hadoop;import java.io.IOException; import java.io.InputStream; import java.net.URI;import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.…

EPSON 機器人多任務下的互鎖處理

在很多時候&#xff0c;有多個任務具有動作命令指令。為了防止多個任務運行動作命令時&#xff0c;對僅有的一個機器人產生的控制沖突&#xff0c;有必要進行連鎖處理。一個任務進行機器人控制時&#xff0c;另一個任務則會等待控制權。這樣&#xff0c;各任務就可以完全按照預…

mysql高可用方案MHA介紹

mysql高可用方案MHA介紹概述MHA是一位日本MySQL大牛用Perl寫的一套MySQL故障切換方案&#xff0c;來保證數據庫系統的高可用.在宕機的時間內&#xff08;通常10—30秒內&#xff09;&#xff0c;完成故障切換&#xff0c;部署MHA&#xff0c;可避免主從一致性問題&#xff0c;節…

SQL遞歸查詢(with as)

SQL遞歸查詢(with cte as) with cte as( select Id,Pid,DeptName,0 as lvl from Department where Id 2 union all select d.Id,d.Pid,d.DeptName,lvl1 from cte c inner join Department d on c.Id d.Pid)select * from cte1 表結構Id Pid …

庖丁解牛TLD(一)——開篇

最近在網上多次看到有關Zdenek Kalal的TLD的文章&#xff0c;說他做的工作如何的帥&#xff0c;看了一下TLD的視頻&#xff0c;感覺確實做的很好&#xff0c;有人夸張的說他這個系統可以和Kniect媲美&#xff0c;我倒是兩者的工作可比性不大&#xff0c;實現的方法也不同。但這…

Arduino從DHT11讀取溫濕度數據并顯示在1602LCD

硬件清單 Arduino NANO1602LCD PCF8574T模塊YL-47 DHT11模塊 連線 1. 連接LCD: PCF8574T模塊4pin(Gnd, Vcc, SDA i2c數據, SCL i2c時鐘) 連接至Arduino接口 Gnd -> Gnd, Vcc -> Vcc, SDA -> A4, SDL -> A52. 連接YL-47 DHT11: Gnd -> Gnd, Vcc -> Vcc, Data…