database - 根据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 函数在单个查询中实现,或者需要编写一些程序。任何线索或示例都会有所帮助。
谢谢
解决方案
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
;
推荐阅读
- c# - 令牌中的自定义属性
- django - 在前端使用 reactjs 时是否需要使用 django 表单?
- r - 将数据集中的一组数据更改为不同的条目
- sql - 多个 NVL 参数
- java - 当我使用带有文本的文本文件(如下所示)运行此代码时,为什么它会给我一个 java.util.InputMismatchException
- javascript - 模板剑道网格Jquery中的Concat变量
- c - 理解不同C指针赋值的区别
- angular - 为排序标题事件角材质创建模拟
- bixby - “表单”和“布局”可以一起用于渲染输入视图吗?
- vue.js - 如何将 CodePen 拆分为 webpacked 组件?