2012-08-17 53 views
2

我不能做一個乾淨的SELECTPostgreSQL的隨機選擇具有獨特的價值

我有一個領域PostgreSQL表 ID,providerid,DEAL_NAME

我要讓隨機選擇具有獨特providerid

SELECT * FROM deals ORDER BY random() LIMIT 10 

我如何設置此返回10結果與唯一的提供者?

+0

Similar questions:http://stackoverflow.com/questions/8674718/best-way-to-select-random-rows-postgresql,http://stackoverflow.com/questions/6090969/postgresql-select-20-隨機記錄,http://stackoverflow.com/questions/5297396/quick-random-row-selection-in-postgres – 2012-08-17 14:57:57

+1

你究竟是什麼意思的「獨特」在這裏?不同的,即10不一樣?請顯示您的表格結構和一些示例數據。 – 2012-08-17 14:59:29

回答

3

可以將您的問題改述爲:

「各10個隨機選擇的供應商,找到由供應商提供一個隨機選擇交易」?

如果是這樣,那幾乎告訴你該怎麼做。您需要兩層,一個傳遞隨機選擇十個供應商,然後一個傳遞來爲每個供應商選擇一個隨機交易。

由於虛擬數據:

create table spam (deal text, provider text); 

insert into spam(deal,provider) 
SELECT prov_id||n::text, prov_id FROM (
    SELECT chr(x) AS prov_id from generate_series(97, 92+26) x) y 
CROSS JOIN generate_series(1,10) n; 

select provider FROM spam GROUP BY provider ORDER BY random() LIMIT 10; 

這裏有一個工程:

SELECT 
(SELECT deal FROM spam WHERE spam.provider = sel_prov.provider ORDER BY random() LIMIT 1), 
sel_prov.provider 
FROM (select provider FROM spam GROUP BY provider ORDER BY random() LIMIT 10) sel_prov; 

...非常簡單,只是通過實施以上爲SQL措辭。不知道它是否快速;你明白了。

如果上述改寫不正確,請通過示例數據和示例說明您的問題,或者在您的描述中提供一些更詳細的信息。

2

如果@Craig林格提出的改寫是正確的:

各10個隨機選擇的供應商,找到由供應商提供的

然後我可以建議另一種解決方案一個隨機選擇交易:

SELECT d.id, d.providerid, d.deal_name FROM (SELECT DISTINCT ON (providerid) providerid , id, deal_name FROM deals) d ORDER BY random() LIMIT 10; 

我希望它會有所幫助!

+0

方便。 'DISTINCT ON'很棒,我總是忘記它,因爲它的表現曾經很糟糕。 – 2012-08-20 07:06:46