Oracle中的排序

Rank,Dense_rank,Row_number函数为每条记录产生一个从1开始至N的自然数,N的值可能小于等于记录的总数。
这3个函数的唯一区别在于当碰到相同数据时的排名策略。

①ROW_NUMBER:
Row_number函数返回一个唯一的值,当碰到相同数据时,排名按照记录集中记录的顺序依次递增。

②DENSE_RANK:
Dense_rank函数返回一个唯一的值,除非当碰到相同数据时,此时所有相同数据的排名都是一样的。

③RANK:
Rank函数返回一个唯一的值,除非遇到相同的数据时,此时所有相同数据的排名是一样的,
同时会在最后一条相同记录和下一条不同记录的排名之间空出排名。

TABLE:S (subject,mark)
数学,80
语文,70
数学,90
数学,60
数学,100
语文,88
语文,65
语文,77

现在我想要的结果是:每门科目的前3名的分数

数学,100
数学,90
数学,80
语文,88
语文,77
语文,70
那么语句就这么写:

select * from (select rank() over(partition by subject order by mark desc) rk,S.* from S) T
where T.rk<=3;

dense_rank与rank()用法相当,但是有一个区别:dence_rank在处理相同的等级时,等级的数值不会跳过。rank则跳过。


先建了张测试表
SQL> select * from test_a;
ID                   PLAYNAME                  SCORE
-------------------- -------------------- ----------
01                   aa                          100
02                   aa                          101
02                   bb                           99
03                   bb                           98
04                   aa                          101
02                   aa                          101
需求是,将score降序排序,打印所有字段,并且如果是同一个playname的score只取出最高分,如果这个playname获得过多个相同的最高分,
则只取出其中一个(比如:aa获得过3次101,则只取其中一个),最终要的结果就是:
       RK ID                   PALYNAME                  SCORE
---------- -------------------- -------------------- ----------
         1 02                   aa                          101
         1 02                   bb                           99

select rank() over(partition by playname order by score desc,id) rk,t.* from test_a t
RK ID PLAYNAME SCORE
---------- -------------------- --------------------
1 02 aa 101
1 02 aa 101
3 04 aa 101
4 01 aa 100
1 02 bb 99
2 03 bb 98

SQL> select distinct * from (select rank() over(partition by playname order by score desc,id) rk,t.* from test_a t) where rk=1;
        RK ID                   PLAYNAME                  SCORE
---------- -------------------- -------------------- ----------
         1 02                   aa                          101
         1 02                   bb                           99
这里order by score desc,id  以score降序和id这两个字段排序,也就是说,正因为相同的playname对应的id不同,这样相同的playname,
相同的score,但是不同的id,这样的2行数据就获得了不同的rank,而rk=1,即是只取rank=1,也就是最高分。这样就完成了需求。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值