我的表格似乎是
yr num name
2010 1 a
2010 2 b
2011 3 c
2011 1 a
2011 2 b
我必须为此表生成序列,它应如下所示
yr num name seq
2010 1 a 1
2011 1 a 2
2010 2 b 1
2011 2 b 2
2011 3 c 1
答案 0 :(得分:1)
您可以使用分析 ROW_NUMBER 功能生成所需的序列。
例如,
假设您的现有表格如下:
SQL> SELECT * FROM t;
YR NUM N
---------- ---------- -
2010 1 a
2010 2 b
2011 3 c
2011 1 a
2011 2 b
SQL>
I generate the desired output using **ROW_NUMBER** and name it `seq`:
SQL> SELECT t.*, row_number() over (partition by name order by yr, name) seq FROM t;
YR NUM N SEQ
---------- ---------- - ----------
2010 1 a 1
2011 1 a 2
2010 2 b 1
2011 2 b 2
2011 3 c 1
SQL>
现在,我使用上述查询创建一个新表:
SQL> CREATE TABLE t_new AS SELECT t.*, row_number() OVER (PARTITION BY NAME ORDER BY yr, NAME) seq FROM t;
Table created.
SQL>
所以,我的新表格包含所需的序列列:
SQL> SELECT * FROM t_new;
YR NUM N SEQ
---------- ---------- - ----------
2010 1 a 1
2011 1 a 2
2010 2 b 1
2011 2 b 2
2011 3 c 1
SQL>
您不需要旧表,因此将其删除并将新表重命名为旧表:
SQL> DROP TABLE t PURGE;
Table dropped.
SQL> ALTER TABLE t_new RENAME TO t;
Table altered.
SQL> SELECT * FROM t;
YR NUM N SEQ
---------- ---------- - ----------
2010 1 a 1
2011 1 a 2
2010 2 b 1
2011 2 b 2
2011 3 c 1
SQL>
完成!
注意:
使用 CTAS 方法,请确保您创建必要的索引以及与旧表关联的其他内容。