oracle排名次的问题

一张表内有一个字段a,记录了从0-100的整数,现要根据a来排名次,然后把名次写在字段b里   
 
如: 
 
id        a          b
1          2          0 
2          5          0   
3          5          0
4          6          0
5          3          0
 
排名次的结果应该是 
 
b(名次)    id    a 
1          4      6 
2          2      5 
3          3      5 
4          5      3 
5          1      2 
 
这样的SQL语句怎么写最好呢?

 

解答:

SQL> select *from ts1 ;

        ID          A          B
---------- ---------- ----------
         1          2          0
         2          5          0
         3          5          0
         4          6          0
         5          3          0
SQL> update ts1 t
  2  set t.b = (select num from
  3      (select row_number()over(order by a asc) as num, rowid as rid from ts1
)
  4      where t.rowid = rid);

已更新5行。
SQL> select *from ts1 ;

        ID          A          B
---------- ---------- ----------
         1          2          1
         2          5          3
         3          5          4
         4          6          5
         5          3          2
如果需要逆序的排序,只需要修改
SQL> update ts1 t
  2  set t.b = (select num from
  3      (select row_number()over(order by a desc) as num, rowid as rid from ts1
 )
  4      where t.rowid = rid);

已更新5行。
SQL> select b, id ,a from ts1 order by 1 ;

         B         ID          A
---------- ---------- ----------
         1          4          6
         2          2          5
         3          3          5
         4          5          3
         5          1          2

分析:

select row_number()over(order by a desc) as num, rowid as rid from ts1
num --- 取得排名, row_number()over(...)分析函数的用法可以在网上搜索
rowid -- 数据行的实际物理地址

update ts1 t
set t.b =
  (select num from
     (select row_number()over(order by a desc) as num, rowid as rid from ts1 )
   where t.rowid = rid);

首先确定数据的排名和物理地址,然后根据物理地址更新排名

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值