Oracle開窗函數筆記及應用場景


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

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

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

開窗函數指定了分析函數工作的數據窗口大小,這個數據窗口大小可能會隨着行的變化而變化

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

例子:成績表的例子,

學號 姓名 班級 成績
111 小王 2 92
123 小李 1 90
134 小錢 1 92
145 小順 2 100

數據表為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

 select stuId,
        stuName,
        classId,
        rank() over(partition by classId order by score desc) rn
   from t_score;

在這里插入圖片描述
over函數和dense_rank一起使用:
dense_rank函數是rank函數的補充,假如有分數一樣的兩條數據,出現了兩人並列第二名的情況,實際的第3名算的是正確的

select stuId,
       stuName,
       classId,
       dense_rank() over(partition by classId order by score desc) rn
  from t_score;

在這里插入圖片描述

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的分析函數功能還是做得比較齊全的


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM