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);

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

 
Oracle数据库中的排名函数(Ranking Functions)主要用于在查询结果中对数据进行排名分析。这些函数常用于处理如工资排名、销售排名等场景,能够为每一行数据分配一个排名值,根据特定的排序规则来确定其位置。 常见的排名函数包括: - `RANK()`:计算排名时会跳过重复的排名值。例如,如果有两个第一名,则下一个排名将是第三名。 - `DENSE_RANK()`:与`RANK()`类似,但不会跳过任何排名值。如果有两个第一名,则下一个排名是第二名。 - `ROW_NUMBER()`:为每一行分配唯一的连续整数,即使有重复值也不会跳过。 这些函数通常与`OVER()`子句一起使用,以定义排名的分区和排序方式。`OVER()`子句可以包含`PARTITION BY`和`ORDER BY`部分,前者用于指定分组列,后者用于指定排序列。 以下是一个使用`RANK()`函数的示例,该示例展示了如何查询部门60的所有员工的排名排名按照工资由低到高的顺序排列[^2]: ```sql SELECT department_id, last_name, salary, RANK() OVER (PARTITION BY department_id ORDER BY salary) AS RANK FROM employees_t WHERE department_id = 60 ORDER BY RANK, last_name; ``` 在这个例子中,`PARTITION BY department_id`确保了排名是在每个部门内部独立进行的,而`ORDER BY salary`则指定了按照工资升序排列来进行排名。 ### 使用场景 1. **财务分析**:在财务报表中,可能需要根据销售额、利润等指标对产品或销售人员进行排名。 2. **人力资源管理**:HR部门可能会利用排名功能来评估员工绩效,比如根据员工的业绩指标进行排名。 3. **学术研究**:在教育领域,排名功能可以帮助研究人员分析学生的成绩分布情况。 ### 注意事项 - 当使用`RANK()`时,如果存在多个相同值的情况,后续的排名将会被跳过,这可能导致排名不连续。 - 如果希望得到连续的排名结果,即使有相同的值也应该递增,那么应该选择`DENSE_RANK()`。 - 若需要给每行一个唯一的编号,无论是否有重复值,应使用`ROW_NUMBER()`。 通过合理运用这些排名函数,可以更加灵活地对数据库中的数据进行分析和展示。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值