我需要根据下面的 SEQNO 列创建新序列,我希望最小 SEQNO 始终以 1 开头。我该怎么做? 我并不是想改变原来的表。 我只是想向我提取的数据添加一个新列,这样我就可以更轻松地与其他表连接。
以下是表中的示例。 “Order”列是我根据 SEQNO 列拉取数据时要创建的列。
ID SEQNO Order
N1 4 1
N1 7 2
N1 11 3
N2 3 1
N2 5 2
我没有尝试任何事情,因为我不知道从哪里开始。
这是一种方法:使用 row_number
分析函数查找序数(
新序列值)。然后
merge
将其与“原始”表一起使用。
之前:
SQL> select * from test order by id, seqno;
ID SEQNO C_ORDER
-- ---------- ----------
N1 4
N1 7
N1 11
N2 3
N2 5
设置新序列:
SQL> merge into test a
2 using (select b.id, b.seqno,
3 row_number() over (partition by b.id order by b.seqno) c_order
4 from test b
5 ) x
6 on ( a.id = x.id
7 and a.seqno = x.seqno
8 )
9 when matched then update set
10 a.c_order = x.c_order;
5 rows merged.
之后:
SQL> select * from test order by id, seqno;
ID SEQNO C_ORDER
-- ---------- ----------
N1 4 1
N1 7 2
N1 11 3
N2 3 1
N2 5 2
SQL>