sql - 将列中的数值分别替换为列中其他值的排名

标签 sql oracle

假设我有一个看起来像这样的表:

+---+--------------+------+
|NUM|     NAME     |POINTS|
+-------------------------+
| 1 |   Peter      | 92   |
| 1 |   Rose       | 93   |
| 1 |   Karl       | 94   |
| 2 |   Frank      | 15   |
| 2 |   Sarah      | 16   | 
+-------------------------+

主键是 NUM 和 NAME 的组合。

现在我想用他们的排名替换 POINTS 中的数字,每个数字从 1 开始。我想实际更新表格。

示例:

+---+--------------+------+
|NUM|     NAME     |POINTS|
+-------------------------+
| 1 |   Peter      | 3    |
| 1 |   Rose       | 2    |
| 1 |   Karl       | 1    |
| 2 |   Frank      | 1    |
| 2 |   Sarah      | 2    | 
+-------------------------+

最好的方法是什么?

最佳答案

如果您想实际更改表中的值,可以使用 MERGE 语句:

merge into the_table t
using (
  select num, name, 
         dense_rank() over (partition by num order by points) as rnk
  from the_table
) x on (x.num = t.num and x.name = t.name)
when matched then update
   set points = x.rnk;

如果您只想显示值,请单独使用内部选择:

select num, name, 
       dense_rank() over (partition by num order by points) as points,
from the_table

关于sql - 将列中的数值分别替换为列中其他值的排名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58994041/

相关文章:

mysql - 案例陈述失败

SQL 选择动态计数

php - 产品图片设置不保存 woocommerce

python - Sqlalchemy - 核心 - 创建现有表的副本

mysql - 在MySql中检索列名而不是外部ID

sql - 生成数据库指标的简单查询?

oracle - PLSQL 流水线函数返回列表

sql-server - 在 Oracle/SqlServer/PgSql 表名开头使用@

node.js - 如何使用 Node.js 将多条记录插入 Oracle DB

oracle - 在 EF6 中更改数据库架构的最简洁方法