2014-03-13 57 views
4

我想添加一個隨機數的列使用setseed到一個表。postgres隨機使用setseed

原始表結構(test_input) col_a,col_b,col_c

希望的輸出(test_output) col_a, col_b, col_c, random_id

下面返回的所有行,而不是每一行中具有不同的值相同random_id

select col_a,col_b,col_c,setseed(0.5),(
    select random() from generate_series(1,100) limit 1 
    ) as random_id 
from test_input 

能不能幫我修改使用setseed並返回各行的不同random_id查詢?

回答

4

您必須以不同方式使用setseed。在你的例子中,generate_series()也是錯誤的。你需要使用類似:

select setseed(0.5); 

select col_a,col_b,col_c, random() as random_id from test_input; 

如果你想分配給同一行相同的隨機數,你將不得不行第一排序,報價documentation

如果ORDER BY子句被指定,返回的行按 指定的順序排序。如果未給出ORDER BY,那麼系統會以系統發現的最快速度生成的任何順序將行返回 。

您可以使用:

select setseed(0.5); 

select *, random() as random_id from (  
select col_a,col_b,col_c from test_input order by col_a, col_b, col_c) a; 

在這裏,我假設的col_a, col_b, col_c該組合是獨一無二的。如果不是這種情況,則必須首先向表中添加具有唯一標識的另一列,然後按上述查詢中的此列進行排序。

+0

謝謝,我給了這個嘗試。但是,如果使用相同的setseed(0.5)多次運行此查詢,則random_id將發生更改。你知道如何防止這個,所以我能夠複製樣本? – user3416355

+0

您可能需要先對數據進行排序,查看我更新的答案。 –

+0

當一個應用程序提供來自多個用戶的請求時,他們每個人都嘗試設置其個人種子並根據該種子執行選擇時,必須同時選擇查詢在事務中運行?什麼應該是隔離級別?我們可以將兩個選擇結合在一起嗎? – Kolyunya