クリーンなSELECTを1つ作成できません
フィールド id 、 providerid 、 deal_name を持つpostgresqlテーブルがあります
独自のprovideridでランダムセレクトしたい
SELECT * FROM deals ORDER BY random() LIMIT 10
一意の providerid で 10 件の結果を返すように設定するにはどうすればよいですか?
クリーンなSELECTを1つ作成できません
フィールド id 、 providerid 、 deal_name を持つpostgresqlテーブルがあります
独自のprovideridでランダムセレクトしたい
SELECT * FROM deals ORDER BY random() LIMIT 10
一意の providerid で 10 件の結果を返すように設定するにはどうすればよいですか?
あなたの質問は次のように言い換えることができますか?
「ランダムに選択された 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として実装するだけです。速いかどうかはわかりません。あなたはアイデアを得る。
上記の言い換えが正しくない場合は、サンプル データと例を使用して質問を明確にするか、説明に詳細を記載してください。
@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;
それが役立つことを願っています!