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