これでうまくいくはずです:
WITH CTE AS (
SELECT random() * (SELECT SUM(percent) FROM YOUR_TABLE) R
)
SELECT *
FROM (
SELECT id, SUM(percent) OVER (ORDER BY id) S, R
FROM YOUR_TABLE CROSS JOIN CTE
) Q
WHERE S >= R
ORDER BY id
LIMIT 1;
サブクエリQ
次の結果が得られます:
1 50
2 85
3 100
次に、範囲[0、100)のランダムな数値を生成し、その数値以上の最初の行を選択します(WHERE
句)。一般的なテーブル式(WITH
)を使用します )乱数が1回だけ計算されるようにします。
BTW、SELECT SUM(percent) FROM YOUR_TABLE
percent
で任意の重みを設定できます -厳密にパーセンテージである必要はありません(つまり、合計で100になります)。
[SQLフィドル]