前几天工作遇到了这样一个问题:
我要修改sort的值,是根据e_id来分组的,第一条值是1,第二条值是2,依次类推,
sort字段现在为null,有个字段e_id假如为1下面有5条数据,e_id为1的sort就是1、2、3、4、5
比如我现在是要操作xx表
方法:我首先想到用,先分组,写值存入临时表,而更新xx表的sort来自这个临时表
update xx
set ie.sort =
(select row_number() over(partition by e.e_id order by e.update_time desc)
from xx e
)
发现无法实现.想了很久才发现,临时表分了组,但是xx是没有顺序的,所以插入时候出错了.
另一方法:一天之后,想起来了执行过程
declare
j number := 1;
begin
FOR i IN (select e_id from xx group by e_id) LOOP
FOR s IN (select t.e_id, t.preedit_id
from xx t
where t.e_id = i.e_id
order by t.update_time desc) LOOP
update xx
set sort = j
where e_id = i.e_id
and preedit_id = s.preedit_id;
j := j + 1;
END LOOP;
j := 1;
END LOOP;
END;
两个for循环,找到一个就插入,简单实现了.
i是在e_id分组
j是e_id分组下的每一个preedit_id .循环下的话,就找到对应的列,修改sort即可.