DB2 根据另一列中的不同值使用递增数字更新列
DB2 update column with incrementing number based on distinct values in another column
对于每个不同的 ref_no
值,我想用从 1 开始的 运行ning 递增值序列更新 seq_no
列。
REF_NO SEQ_NO (initial) SEQ_NO (expected)
------- ------- -------
111. - 1.
111. - 2.
111. - 3.
222. - 1.
222. - 2.
333. - 1.
100. - 1.
100. - 2.
100. - 3.
100. - 4.
0. - 1.
333. - 2.
100. - 5.
200. - 1.
我只能通过重复多个语句来做到这一点:
declare x1 cursor for select * from xyz where seq_no is null for update of seq_no
open x1
fetch from x1
update xyz a set a.seq_no = (select nvl(max(b.seq_no)+1, 1) from xyz b where b.ref_no = a.ref_no) where current of x1
-- REPEAT ABOVE TWO STATEMENTS UNTIL FETCH RETURNS NO ROW --
close x1
select * from xyz
是否可以完全使用单个 UPDATE
语句 运行 一次来更新整个 table?数据库是IBM DB2。
注意:不同 ref_no 行的实际顺序是任意的,无关紧要。
使用Row_Number
window函数
select row_number()over(partition by REF_NO order by REF_NO) as seq_no
from yourtable
要更新 table 试试这个
MERGE INTO xyz A
USING (SELECT rowid row_id,
Row_number()
OVER(
partition BY ref_no
ORDER BY ref_no ) as seq_no
FROM xyz) B
ON A.rowid = B.row_id
WHEN MATCHED THEN
UPDATE SET A.seq_no = B.seq_no
如果您没有 table 主键,您可以使用 Relative Record Number SQL Function 和下面的查询来更新您的结果:
MERGE INTO
ref AS r
USING
(
SELECT
RRN(ref) AS rrn,
ROW_NUMBER() OVER(PARTITION BY ref_no ORDER BY RRN(ref)) AS seq_no
FROM
ref
) AS n
ON
RRN(r) = n.rrn
WHEN MATCHED THEN
UPDATE SET
seq_no = n.seq_no;
一般来说,table 上没有主键列是个坏主意。考虑添加标识列。它可以在已经存在的 table:
处完成
ALTER TABLE ref ADD COLUMN id INTEGER NOT NULL DEFAULT 0;
ALTER TABLE ref ALTER COLUMN id SET GENERATED ALWAYS AS IDENTITY;
对于每个不同的 ref_no
值,我想用从 1 开始的 运行ning 递增值序列更新 seq_no
列。
REF_NO SEQ_NO (initial) SEQ_NO (expected)
------- ------- -------
111. - 1.
111. - 2.
111. - 3.
222. - 1.
222. - 2.
333. - 1.
100. - 1.
100. - 2.
100. - 3.
100. - 4.
0. - 1.
333. - 2.
100. - 5.
200. - 1.
我只能通过重复多个语句来做到这一点:
declare x1 cursor for select * from xyz where seq_no is null for update of seq_no
open x1
fetch from x1
update xyz a set a.seq_no = (select nvl(max(b.seq_no)+1, 1) from xyz b where b.ref_no = a.ref_no) where current of x1
-- REPEAT ABOVE TWO STATEMENTS UNTIL FETCH RETURNS NO ROW --
close x1
select * from xyz
是否可以完全使用单个 UPDATE
语句 运行 一次来更新整个 table?数据库是IBM DB2。
注意:不同 ref_no 行的实际顺序是任意的,无关紧要。
使用Row_Number
window函数
select row_number()over(partition by REF_NO order by REF_NO) as seq_no
from yourtable
要更新 table 试试这个
MERGE INTO xyz A
USING (SELECT rowid row_id,
Row_number()
OVER(
partition BY ref_no
ORDER BY ref_no ) as seq_no
FROM xyz) B
ON A.rowid = B.row_id
WHEN MATCHED THEN
UPDATE SET A.seq_no = B.seq_no
如果您没有 table 主键,您可以使用 Relative Record Number SQL Function 和下面的查询来更新您的结果:
MERGE INTO
ref AS r
USING
(
SELECT
RRN(ref) AS rrn,
ROW_NUMBER() OVER(PARTITION BY ref_no ORDER BY RRN(ref)) AS seq_no
FROM
ref
) AS n
ON
RRN(r) = n.rrn
WHEN MATCHED THEN
UPDATE SET
seq_no = n.seq_no;
一般来说,table 上没有主键列是个坏主意。考虑添加标识列。它可以在已经存在的 table:
处完成ALTER TABLE ref ADD COLUMN id INTEGER NOT NULL DEFAULT 0;
ALTER TABLE ref ALTER COLUMN id SET GENERATED ALWAYS AS IDENTITY;