oralce中的分組排序

2021-09-01 07:10:25 字數 4233 閱讀 1750

目前有3張表

-----學生

create table student(

student_id number primary key,

student_name varchar2(30) not null)

insert into student value(student_id,student_name) values (1,'張三');

insert into student value(student_id,student_name) values (2,'李四');

insert into student value(student_id,student_name) values (3,'王五');

insert into student value(student_id,student_name) values (4,'趙六');

insert into student value(student_id,student_name) values (5,'劉七');

insert into student value(student_id,student_name) values (6,'陳八');

------分數

create table score(

score_id number primary key,

student_id number,

course_id number,

score number)

insert into score value(score_id,student_id,course_id,score) values (1,1,1,92);

insert into score value(score_id,student_id,course_id,score) values (2,1,2,93);

insert into score value(score_id,student_id,course_id,score) values (3,1,3,94);

insert into score value(score_id,student_id,course_id,score) values (4,2,1,93);

insert into score value(score_id,student_id,course_id,score) values (5,2,2,92);

insert into score value(score_id,student_id,course_id,score) values (6,2,3,91);

insert into score value(score_id,student_id,course_id,score) values (7,3,1,92);

insert into score value(score_id,student_id,course_id,score) values (8,3,2,94);

insert into score value(score_id,student_id,course_id,score) values (9,3,3,95);

insert into score value(score_id,student_id,course_id,score) values (10,4,1,96);

insert into score value(score_id,student_id,course_id,score) values (11,4,2,97);

insert into score value(score_id,student_id,course_id,score) values (12,4,3,94);

insert into score value(score_id,student_id,course_id,score) values (13,5,1,98);

insert into score value(score_id,student_id,course_id,score) values (14,5,2,91);

insert into score value(score_id,student_id,course_id,score) values (15,5,3,90);

insert into score value(score_id,student_id,course_id,score) values (16,6,1,97);

insert into score value(score_id,student_id,course_id,score) values (17,6,2,99);

insert into score value(score_id,student_id,course_id,score) values (18,6,3,95);

-------課程表

create table course(

course_id number primary key,

course_name varchar2(30))

insert into course value(course_id,course_name) values (1,'語文')

insert into course value(course_id,course_name) values (2,'數學')

insert into course value(course_id,course_name) values (3,'英語')

在「英語」這科中,有2個學生的成績都是95分而且都是這科排名第一的,所以當我要查詢,每科目的第一名時

select * from(select sc.course_id,co.course_name,sc.score,st.student_name,[color=red]dense_rank() [/color]over(partition by co.course_name order by sc.score desc) rn from score sc left join course co on sc.course_id=co.course_id 

left join student st on sc.student_id=st.student_id) t where t.rn=1 order by t.course_id,rn asc;

select * from(select sc.course_id,co.course_name,sc.score,st.student_name,[b] [color=red]rank()[/color]() [/b]over(partition by co.course_name order by sc.score desc) rn from score sc left join course co on sc.course_id=co.course_id 

left join student st on sc.student_id=st.student_id) t where t.rn=1 order by t.course_id,rn asc;

select * from(select sc.course_id,co.course_name,sc.score,st.student_name,[b] [color=red]row_number()[/color]() [/b]over(partition by co.course_name order by sc.score desc) rn from score sc left join course co on sc.course_id=co.course_id 

left join student st on sc.student_id=st.student_id) t where t.rn=1 order by t.course_id,rn asc;

從結果中可以得知此時的dense_rank和rank()的結果是正確的,而row_number()只是顯示其中的一條,至於為什麼會選擇那條希望有人幫我解答下。。。

而當我們要查詢每科目的前3名時即改變rn<4,此時彼此之間的區別就很明顯了

在此我們只比較英語這科的排名

dense_rank()會列出4列,其中有2個成績95分的會並列第一,成績94的排名第二

rank()會列出3列,其中有2個成績95分的會並列第一,成績94的排名第三

row_number()會列出3列,其中有2個成績95分的從中選乙個拍第一,另乙個成績也是95的則排名第二,成績94的排名第三

oracle中的分組排序

1.首先,需要建表。表名 coursr 失誤,表名寫錯了 2.我們需要對每個課程進行排序。3.知識準備 分組排序函式有3種 4.執行 select t.row number over partition by t.coursename order by t.coursescore desc cour...

hive中的排序和分組

order by order by 會對輸入坐全域性排序,因此 只有乙個reducer 多個reducer會無法保證全域性有序 只有乙個reducer,會導致當輸入規模較大時,需要較長的計算時間.set hive.mapred.mode nonstrict default value 預設值 set...

SQL中的排序和分組

sql中的排序和分組 一 排序 order by 語法 select 字段 from 表名稱 where 篩查條件 order by 排序字段列表 順序不能亂 desc ace select from student where name like 文 order by name desc二 分組 ...