如何在 Oracle table 的列中向下移动值?
How do you shift values down in a column in an Oracle table?
给定以下 oracle 数据库 table:
小组修改意见
1 1 1
1 2 2
1 空 空
2 1 1
2 2 2
2 3 3
2 4 4
2 空 空
3 1 1
3 2 2
3 3 3
3 空 空
我想在其组内将评论栏相对于版本向下移动一级,以便我得到以下 table:
小组修改意见
1 1 空
1 2 1
1 无效 2
2 1 空
2 2 1
2 3 2
2 4 3
2 空 4
3 1 空
3 2 1
3 3 2
3 空 3
我有以下查询:
合并到 example_table t1
使用 example_table t2
上 (
(t1.revision = t2.revision+1 或
(t2.revision = (
SELECT 最大值(t3.revision)
来自 example_table t3
其中 t3.group = t1.group
) 并且 t1.revision 为空)
)
和 t1.group = t2.group)
匹配后更新 SET t1.comment = t2.comment;
这完成了大部分工作(仍然需要一个单独的查询来覆盖修订版 = 1),但速度很慢。
所以我的问题是,如何在这里尽可能高效地使用 Max 来为每个组拉出最高修订版?
我会使用 lag
而不是 max
create table example_table(group_id number, revision number, comments varchar2(40));
insert into example_table values (1,1,1);
insert into example_table values (1,2,2);
insert into example_table values (1,3,null);
insert into example_table values (2,1,1);
insert into example_table values (2,2,2);
insert into example_table values (2,3,3);
insert into example_table values (2,4,null);
select * from example_table;
merge into example_table e
using (select group_id, revision, comments, lag(comments, 1) over (partition by group_id order by revision nulls last) comments1 from example_table) u
on (u.group_id = e.group_id and nvl(u.revision,0) = nvl(e.revision,0))
when matched then update set comments = u.comments1;
select * from example_table;
给定以下 oracle 数据库 table:
小组修改意见 1 1 1 1 2 2 1 空 空 2 1 1 2 2 2 2 3 3 2 4 4 2 空 空 3 1 1 3 2 2 3 3 3 3 空 空
我想在其组内将评论栏相对于版本向下移动一级,以便我得到以下 table:
小组修改意见 1 1 空 1 2 1 1 无效 2 2 1 空 2 2 1 2 3 2 2 4 3 2 空 4 3 1 空 3 2 1 3 3 2 3 空 3
我有以下查询:
合并到 example_table t1 使用 example_table t2 上 ( (t1.revision = t2.revision+1 或 (t2.revision = ( SELECT 最大值(t3.revision) 来自 example_table t3 其中 t3.group = t1.group ) 并且 t1.revision 为空) ) 和 t1.group = t2.group) 匹配后更新 SET t1.comment = t2.comment;
这完成了大部分工作(仍然需要一个单独的查询来覆盖修订版 = 1),但速度很慢。
所以我的问题是,如何在这里尽可能高效地使用 Max 来为每个组拉出最高修订版?
我会使用 lag
而不是 max
create table example_table(group_id number, revision number, comments varchar2(40));
insert into example_table values (1,1,1);
insert into example_table values (1,2,2);
insert into example_table values (1,3,null);
insert into example_table values (2,1,1);
insert into example_table values (2,2,2);
insert into example_table values (2,3,3);
insert into example_table values (2,4,null);
select * from example_table;
merge into example_table e
using (select group_id, revision, comments, lag(comments, 1) over (partition by group_id order by revision nulls last) comments1 from example_table) u
on (u.group_id = e.group_id and nvl(u.revision,0) = nvl(e.revision,0))
when matched then update set comments = u.comments1;
select * from example_table;