我无法完成一个干净的SELECT
我有postgresql表和字段 id,providerid,deal_name
我想使用唯一的提供符进行随机选择
SELECT * FROM deals ORDER BY random() LIMIT 10
如何将此设置为使用唯一的providerid返回10个结果?
答案 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;
我希望它会有所帮助!