【问题标题】:Postgresql SELECT random with unique valuePostgresql SELECT 随机具有唯一值
【发布时间】:2012-08-17 14:00:26
【问题描述】:

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

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

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

SELECT * FROM deals ORDER BY random() LIMIT 10

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

【问题讨论】:

标签: postgresql select unique


【解决方案1】:

您的问题可以改写为:

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

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

给定虚拟数据:

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

    希望对你有帮助!

    【讨论】:

    • 方便。 DISTINCT ON 很棒,我总是忘记它,因为它的性能曾经很糟糕。
    猜你喜欢
    • 1970-01-01
    • 2015-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多