oracle为什么不更新排名,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);

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值