如何将row_number分配给Oracle SQL中的新列

时间:2015-04-07 09:38:06

标签: sql oracle sequence oracle12c row-number

我的表格似乎是

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

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 方法,请确保您创建必要的索引以及与旧表关联的其他内容。