2

我无法做出一个干净的选择

我有带有字段 id、providerid、deal_name 的 postgresql 表

我想使用唯一的 providerid 进行随机选择

SELECT * FROM deals ORDER BY random() LIMIT 10

我如何设置它以返回 10 个具有唯一 providerid 的结果?

4

2 回答 2

3

你的问题可以改写为:

“对于十个随机选择的供应商中的每一个,找到该供应商提供的一个随机选择的交易”?

如果是这样,那几乎可以告诉您该怎么做。您需要两层,一次通过随机选择十个供应商,然后通过一次通过每个供应商选择一个随机交易。

给定虚拟数据:

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。不知道快不快;你明白了。

如果上述改写不正确,请通过示例数据和示例或描述中的更多细节来澄清您的问题。

于 2012-08-17T15:01:33.187 回答
2

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

对于十个随机选择的提供商中的每一个,找到该提供商提供的一个随机选择的交易

那么我可以建议另一种解决方案:

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;

我希望它会有所帮助!

于 2012-08-17T20:00:41.047 回答