2012-12-07 13 views
1

如何添加在長度爲4一系列的表是這樣的:如何使用重複1,2,3,4,1,2,3,4,......一系列的行數

源表:

id 
1 
2 
3 
4 
5 
6 
7 
8 

結果表:

id series 
1  1 
2  2 
3  3 
4  4 
5  1 
6  2 
7  3 
8  4 

我使用PostgreSQL 9.1。

+0

+1包含的樣本數據,預期成果和PostgreSQL版本。這是一個奇怪的問題,我無法想象爲什麼你想要,但嘿... –

回答

2

如果您的ID非常連續且無間隙,則可以使用id % 4 + 1。但我認爲,實際上你的身份證並不那麼有序,如果他們是從SEQUENCE產生的,你不應該依賴他們的無縫。

你可以用row_number()做正確,如下所示:http://sqlfiddle.com/#!12/22767/5

SELECT 
    id, 
    (row_number() OVER (ORDER BY id) - 1) % 4 + 1 
FROM Table1 
ORDER BY 1; 

也有可能使用generate_series作爲SELECT列表中設置返回功能做的,但是這是一個PostgreSQL的擴展,wheras以上是標準SQL,可以在任何現代數據庫中工作,但不支持窗口功能的MySQL除外。

如果你想實際添加一列到表中,它會變得更復雜一點。我真的不知道爲什麼你要做到這一點,但它使用UPDATE ... FROM可能:

BEGIN; 

ALTER TABLE table1 ADD COLUMN col2 INTEGER; 

WITH gen_num(id,n) AS (
    SELECT 
     id, 
     (row_number() OVER (ORDER BY id) - 1) % 4 + 1 
    FROM Table1 
    ORDER BY 1) 
UPDATE table1 SET col2 = n 
FROM gen_num 
WHERE gen_num.id = table1.id; 

COMMIT; 
+0

「如果它們是從SEQUENCE生成的,你不應該依賴它們無間隙。」爲什麼? :( – Ali

+1

@Ali請參閱'nextval'的文檔:http://www.postgresql.org/docs/current/static/functions-sequence.html。基本上,從一個序列生成的條目不會被重用,如果一個事務回滾其他注意事項:http://www.postgresql.org/docs/current/static/sql-createsequence.html –

+0

'%'?剩餘的含義是什麼? – Ali

相關問題