2015-04-07 26 views
0

我的表看起來像如何在Oracle SQL分配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

到目前爲止您嘗試過什麼?獲得你描述的結果的過程是什麼? – TZHX

+0

我試着生成一個正常的序列,我想爲此創建觸發器,並在中間敲擊 – ramya

+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方法,請確保您創建必要的索引和用舊錶相關的其他東西。

+0

感謝您解決它的工作。 – ramya