Postgresql SELECT随机具有唯一值

时间:2012-08-17 14:00:26

标签: postgresql select unique

我无法完成一个干净的SELECT

我有postgresql表和字段 id,providerid,deal_name

我想使用唯一的提供符进行随机选择

SELECT * FROM deals ORDER BY random() LIMIT 10

如何将此设置为使用唯一的providerid返回10个结果?

2 个答案:

答案 0 :(得分: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。不知道它是否快;你明白了。

如果上述重新措辞不正确,请使用示例数据和示例或您说明中的更多详细信息澄清您的问题。

答案 1 :(得分:2)

如果@Craig Ringer提出的改述是正确的:

  

对于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;

我希望它会有所帮助!