Oracle應用之開窗函式筆記及應用場景

2021-09-05 19:37:38 字數 2506 閱讀 5075

介紹oracle的開窗函式之前先介紹一下分析函式,因為開窗函式也屬於分析函式

分析函式用於計算基於組的某種聚合值,它和聚合函式的不同之處是:對於每個組返回多行,而聚合函式對於每個組只返回一行。

上面是開窗函式的簡單介紹。

開窗函式指定了分析函式工作的資料視窗大小,這個資料視窗大小可能會隨著行的變化而變化

oracle開窗函式有很多,用的比較多的是over(…),使用的話一般是和order、partition by、row_number()、rank()、dense_rank()幾個函式一起使用

例子:成績表的例子,

學號姓名

班級成績

111小王292

123小李190

134小錢192

145小順

2100

資料表為t_score,字段分別為stuid,stuname,classid ,score

create table t_score(

stuid varchar2(20),

stuname varchar2(50),

classid number,

score float

);insert into t_score(stuid,stuname,classid,score) values('111','小王',1,92);

insert into t_score(stuid,stuname,classid,score) values('123','小李',1,90);

insert into t_score(stuid,stuname,classid,score) values('134','小錢',1,92);

insert into t_score(stuid,stuname,classid,score) values('145','小順',1,100);

over函式和row_number一起使用:開窗函式和row_number函式一起使用的話,就是返回一行,不過這裡其實不適合用來統計,因為統計成績的話,可以存在分數一樣的兩條資料,而row_number只返回一條資料。

select *

from (select stuid, stuname, classid,

row_number() over(partition by classid order by score desc) rn

from t_score)

where rn = 1;

over函式和rank一起使用:rank函式功能也是排序,這裡的話,假如有分數一樣的兩條資料的情況,如圖sql是根據score排序的,有兩人並列第二名,實際的第3名就被算成第4名了,如圖,rn=4

over函式和dense_rank一起使用:dense_rank函式是rank函式的補充,假如有分數一樣的兩條資料,出現了兩人並列第二名的情況,實際的第3名算的是正確的

ok,這種是同班級的情況,對於不同班級的情況,修改資料

insert into t_score(stuid,stuname,classid,score) values('111','小王',2,92);

insert into t_score(stuid,stuname,classid,score) values('123','小李',1,90);

insert into t_score(stuid,stuname,classid,score) values('134','小錢',1,92);

insert into t_score(stuid,stuname,classid,score) values('145','小順',2,100);

可以看出,對辦件進行分組再按成績排序,oracle的分析函式功能還是做得比較齊全的

oracle之函式筆記

lower char 將字串轉化為小寫的形式 把emp表的ename轉化為小寫形式 select lower ename from emp upper char 將字串轉化為大寫的形式 select upper ename from emp length char 返回字串的長度 select fr...

oracle開窗函式

1.使用row number分頁,查詢第1 10條資料 select t.custid,t.companyname,t.address,t.city from select row number over order by custid as rownum,custid,companyname,ad...

oracle應用之聚合函式XMLAGG用法簡介

xmlagg函式語法基本如圖,可以用於列轉行,列轉行函式在oracle裡有好幾種方法,wm concat也可以做 這裡介紹wm concat是因為xmlagg實現效果和wm concat是一樣的,只是效能方面不一樣,注意 xmlagg最好排序一下,效能會好點 xmlagg例子 需要實現乙個table...