根据以前的记录更新列

时间:2016-11-12 13:56:44

标签: sql oracle

我有一个表C1,C2,C3,C4,C5,C6和Count。我必须使用C1,C2,C3,C4,C5的顺序订购记录。对于第一个记录,Count将为0,那么如果下一行的C1,C2,C3,C4,C5的值与前一行相同,则我必须通过添加+1来更新Count列。所以这就是我所期待的: 表:

C1   C2    C3    C4    C5    C6     Count
-------------------------------------------
1    A     X     X1    AA    123     0
1    A     X     X1    AA    121     1
1    A     X     X1    AA    118     2
1    A     X     X1    AA    117     3
2    B     X     X2    AA    234     0
8    A     Y     X3    AA    298     0
8    A     Y     X3    AA    800     1

我正在使用Oracle DB。我使用带有Order by的Cursor编写了一个PL SQL块,然后在BULK COLLECT中使用了光标,并与先前的记录相比迭代了每个记录。但是,Count列更新时出现意外记录,并且花费的时间比预期的多,表有大约400k记录。我无法在此输入代码,因为实际代码在客户机中。任何帮助都非常感谢。可以使用PL / SQL或Simple SQL。 DB是Oracle。

2 个答案:

答案 0 :(得分:2)

我相信你想要row_number()

select t.*,
       (row_number() over (partition by c1, c2, c3, c4, c5 order by c6) - 1
       ) as "Count"
from t;

您可以使用merge将其置于update语句中。或者,如果您真的想要update

update t
    set count = (select count(*)
                 from t t2
                 where t2.col1 = t.col1 and t2.col2 = t.col2 and t2.col3 = t.col3 and
                       t2.col4 = t.col4 and t.col5 = t2.col5 and
                       t2.col6 < t.col6
                );

答案 1 :(得分:0)

借助Gordon Linoff提供的提示,我能够解决这个问题。但是,我创建了一个新表而不是更新以避免性能问题。以下是查询:

CREATE TABLE TAB2 AS
SELECT T1.C1, T1.C2, T1.C3, T1.C4, T1.C5, T1.C6, T1.REC_COUNT 
(select t.*,
       (row_number() over (partition by c1, c2, c3, c4, c5 order by c1, c2, c3, c4, c5) - 1
       ) as rec_count
from tab1 T) T1;