--
已知:两种排名方式
(
分区和不分区
):
使用和不使用
partition
--
两种计算方式
(
连续
,
不连续
),
对应函数:
dense_rank,rank
·查询原始数据:学号
,
姓名
,
科目名
,
成绩
select
*
from
t_score
S_ID
S_NAME
SUB_NAME
SCORE
1
张三
语文
80.00
2
李四
数学
80.00
1
张三
数学
0.00
2
李四
语文
50.00
3
张三丰
语文
10.00
3
张三丰
数学
3
张三丰
体育
120.00
4
杨过
JAVA
90.00
5
mike
c++
80.00
3
张三丰
Oracle
0.00
4
杨过
Oracle
77.00
2
李四
Oracle
77.00
·查询各学生科目为
Oracle
排名
(
简单排名
)
select
sc.s_id,sc.s_name,sub_name,sc.score,
rank() over
(
order
by
score
desc
)
名次
from
t_score sc
where
sub_name=
'Oracle'
S_ID
S_NAME
SUB_NAME
SCORE
名次
4
杨过
Oracle
77.00
1
2
李四
Oracle
77.00
1
3
张三丰
Oracle
0.00
3
对比:
rank()
与
dense_rank()
:非连续排名与连续排名
(
都是简单排名
)
select
sc.s_id,sc.s_name,sub_name,sc.score,
dense_rank() over
(
order
by
score
desc
)
名次
from
t_score sc
where
sub_name=
'Oracle'
S_ID
S_NAME
SUB_NAME
SCORE
名次
4
杨过
Oracle
77.00
1
2
李四
Oracle
77.00
1
3
张三丰
Oracle
0.00
2
·查询各学生各科排名
(
分区排名
)
select
sc.s_id,sc.s_name,sub_name,sc.score,
rank() over
(
partition
by
sub_name
order
by
score
desc
)
名次
from
t_score sc
S_ID
S_NAME
SUB_NAME
SCORE
名次
4
杨过
JAVA
90.00
1
4
杨过
Oracle
77.00
1
2
李四
Oracle
77.00
1
3
张三丰
Oracle
0.00
3
5
mike
c++
80.00
1
3
张三丰
数学
1
2
李四
数学
80.00
2
1
张三
数学
0.00
3
3
张三丰
体育
120.00
1
1
张三
语文
80.00
1
2
李四
语文
50.00
2
3
张三丰
语文
10.00
3
·查询各科前
2
名
(
分区排名
)
·类似:新闻表
,
求栏目点击率在前
3
位的新闻。
商品表
,
求各类别销售额在前
10
位的商品。
select * from (
select sc.s_id,sc.s_name,sub_name,sc.score,
dense_rank() over
(partition by sub_name order by score desc)
名次
from t_score sc
) x
where x.
名次
<=2
S_ID
S_NAME
SUB_NAME
SCORE
名次
4
杨过
JAVA
90.00
1
4
杨过
Oracle
77.00
1
2
李四
Oracle
77.00
1