首页 > 解决方案 > 根据Oracle数据库中的两列增加列值

问题描述

我有一个表 Test ,它具有以下结构:

Id  CID RO   Other Columns
1   111  2
2   111  1
3   111  6
4   111  6
5   111  8
6   111  5
7   101  4
8   101  4
9   101  3   

RO 中的结果顺序应如下所示:-> 对于一个 CID,RO 的升序应将顺序 (RO) 替换为 1、2、3、4 等等

RO 列中的最终订单:

(RO 列的值被替换)

 Id  CID RO  (New) RO Other Columns
    1   111  2   2
    2   111  1   1 
    3   111  6   4
    4   111  6   5
    5   111  8   6
    6   111  5   3
    7   101  4   2
    8   101  4   3
    9   101  3   1 

桌子上有数百个这样的cid。请让我知道这是否可以使用一些 Oracle 函数在单个查询中实现,或者需要编写一些程序。任何线索或示例都会有所帮助。

谢谢

标签: databaseoraclefunction

解决方案


NEW_RO 列可以使用解析函数 ROW_NUMBER() 计算:

select ... ,
       row_number() over (partition by cid order by ro) as new_ro  [, ...]

在您的数据中,同一 CID 中的 RO 存在关联。在这种情况下,您是否关心哪一行获得什么 NEW_RO 值?如果,例如,在同一个 RO 的情况下,您还想(进一步)按 ID 订购,您可以将上述更改为

select ... ,
       row_number() over (partition by cid order by ro, id) as new_ro  [, ...]

编辑:我错过了您需要使用 NEW_RO 值更新 RO 值的事实。分析函数不能在UPDATE语句中使用(无论如何都不能直接使用);该MERGE声明是完美的替代方案:

merge into test
  using ( select id, 
                 row_number() over (partition by cid order by ro, id) as new_ro 
          from   test
        ) s
        on (test.id = s.id)
when matched then update set ro = s.new_ro
;

推荐阅读