我无法做出一个干净的选择
我有带有字段 id、providerid、deal_name 的 postgresql 表
我想使用唯一的 providerid 进行随机选择
SELECT * FROM deals ORDER BY random() LIMIT 10
我如何设置它以返回 10 个具有唯一 providerid 的结果?
我无法做出一个干净的选择
我有带有字段 id、providerid、deal_name 的 postgresql 表
我想使用唯一的 providerid 进行随机选择
SELECT * FROM deals ORDER BY random() LIMIT 10
我如何设置它以返回 10 个具有唯一 providerid 的结果?
你的问题可以改写为:
“对于十个随机选择的供应商中的每一个,找到该供应商提供的一个随机选择的交易”?
如果是这样,那几乎可以告诉您该怎么做。您需要两层,一次通过随机选择十个供应商,然后通过一次通过每个供应商选择一个随机交易。
给定虚拟数据:
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。不知道快不快;你明白了。
如果上述改写不正确,请通过示例数据和示例或描述中的更多细节来澄清您的问题。
如果@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;
我希望它会有所帮助!