介紹Oracle的開窗函數(shù)之前先介紹一下分析函數(shù)炫彩,因為開窗函數(shù)也屬于分析函數(shù)
分析函數(shù)用于計算基于組的某種聚合值匾七,它和聚合函數(shù)的不同之處是:對于每個組返回多行,而聚合函數(shù)對于每個組只返回一行江兢。
上面是開窗函數(shù)的簡單介紹昨忆。
開窗函數(shù)指定了分析函數(shù)工作的數(shù)據(jù)窗口大小,這個數(shù)據(jù)窗口大小可能會隨著行的變化而變化
oracle開窗函數(shù)有很多杉允,用的比較多的是over(...)邑贴,使用的話一般是和order、partition by叔磷、row_number()痢缎、rank()、dense_rank()幾個函數(shù)一起使用
例子:成績表的例子世澜,
學(xué)號 | 姓名 | 班級 | 成績 |
---|---|---|---|
111 | 小王 | 2 | 92 |
123 | 小李 | 1 | 90 |
134 | 小錢 | 1 | 92 |
145 | 小順 | 2 | 100 |
數(shù)據(jù)表為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函數(shù)和row_number一起使用:
開窗函數(shù)和row_number函數(shù)一起使用的話,就是返回一行封恰,不過這里其實不適合用來統(tǒng)計麻养,因為統(tǒng)計成績的話,可以存在分?jǐn)?shù)一樣的兩條數(shù)據(jù)诺舔,而row_number只返回一條數(shù)據(jù)鳖昌。
select *
from (select stuId, stuName, classId,
row_number() over(partition by classId order by score desc) rn
from t_score)
where rn = 1;
over函數(shù)和rank一起使用:
rank函數(shù)功能也是排序备畦,這里的話,假如有分?jǐn)?shù)一樣的兩條數(shù)據(jù)的情況许昨,如圖sql是根據(jù)score排序的懂盐,有兩人并列第二名,實際的第3名就被算成第4名了糕档,如圖莉恼,rn=4
select stuId,
stuName,
classId,
rank() over(partition by classId order by score desc) rn
from t_score;
over函數(shù)和dense_rank一起使用:
dense_rank函數(shù)是rank函數(shù)的補(bǔ)充,假如有分?jǐn)?shù)一樣的兩條數(shù)據(jù)速那,出現(xiàn)了兩人并列第二名的情況俐银,實際的第3名算的是正確的
select stuId,
stuName,
classId,
dense_rank() over(partition by classId order by score desc) rn
from t_score;
ok,這種是同班級的情況端仰,對于不同班級的情況捶惜,修改數(shù)據(jù)
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);
可以看出,對辦件進(jìn)行分組再按成績排序荔烧,oracle的分析函數(shù)功能還是做得比較齊全的