我有一个表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。
答案 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;