使用增量值更新Oracle中的分组记录

时间:2012-04-19 22:42:14

标签: sql oracle sql-update

所以一个困境,我有一个名为T_GROUP的Oracle表。表中的记录具有唯一ID(ID),它们是Study_ID所标识的研究的一部分,因此多个组可以在同一研究中。

CREATE TABLE T_GROUP
(
    "ID" NUMBER(10,0),
    "GROUP_NAME" VARCHAR2(255 CHAR),
    "STUDY_ID" NUMBER(10,0)
)

现有表有数百条记录,现在我添加了一个名为GROUP_INDEX的新列:

ALTER TABLE T_GROUP ADD (
 GROUP_INDEX NUMBER(10,0) DEFAULT(0)
);

添加列后,我需要运行一个脚本来更新GROUP_INDEX字段:它应该从1开始,并在研究中的每个组增加1,从最低ID开始。

所以现在我的数据如下:

ID  GROUP_NAME      STUDY_ID    GROUP_INDEX
-------------------------------------------
1   Group 1         3           0
2   Group 2         3           0
3   My Group        5           0
4   Big Group       5           0
5   Group X         5           0
6   Group Z         6           0
7   Best Group      6           0

更新后,group_index字段应如下所示:

ID  GROUP_NAME      STUDY_ID    GROUP_INDEX
-------------------------------------------
1   Group 1         3           1
2   Group 2         3           2
3   My Group        5           1
4   Big Group       5           2
5   Group X         5           3
6   Group Z         6           1
7   Best Group      6           2

更新将通过批处理文件从sqlplus运行。我玩过分组和子查询,但我运气不好,从未使用过sqlplus,我不确定是否可以使用变量,游标等等。所有提示都非常感谢!

2 个答案:

答案 0 :(得分:4)

您应该能够将分析函数row_number用于此

UPDATE t_group t1
   SET group_index = (SELECT rnk
                        FROM (SELECT id,
                                     row_number() over (partition by study_id
                                                            order by id) rnk
                                FROM t_group) t2
                       WHERE t2.id = t1.id)

答案 1 :(得分:2)

这是使用MERGE语句的版本。可能比子选择更快(但不一定是)。

merge into t_group
using 
( 
   select id, 
          row_number() over (partition by study_id order by id) rnk
   from t_group
) t on t.id = t_group.id 
when matched then update 
   set group_index = t.rnk;

这假设id是主键(或至少是唯一的)

我现在无法测试,因此可能会出现一些语法错误。