2

クリーンなSELECTを1つ作成できません

フィールド id 、 providerid 、 deal_name を持つpostgresqlテーブルがあります

独自のprovideridでランダムセレクトしたい

SELECT * FROM deals ORDER BY random() LIMIT 10

一意の providerid で 10 件の結果を返すように設定するにはどうすればよいですか?

4

2 に答える 2

3

あなたの質問は次のように言い換えることができますか?

「ランダムに選択された 10 のプロバイダーごとに、そのプロバイダーが提供するランダムに選択された取引を 1 つ見つけます」 ?

もしそうなら、それはあなたが何をすべきかをほとんど教えてくれます。2 つのレイヤーが必要です。1 つのパスで 10 のプロバイダーをランダムに選択し、次に 1 つのパスでプロバイダーごとに 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として実装するだけです。速いかどうかはわかりません。あなたはアイデアを得る。

上記の言い換えが正しくない場合は、サンプル データと例を使用して質問を明確にするか、説明に詳細を記載してください。

于 2012-08-17T15:01:33.187 に答える
2

@Craig Ringer によって提案された言い換えが正しい場合:

ランダムに選択された 10 のプロバイダーのそれぞれについて、そのプロバイダーが提供するランダムに選択された取引を 1 つ見つけます。

次に、別の解決策を提案できます。

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 に答える