sql >> データベース >  >> RDS >> PostgreSQL

加重行確率を持つPostgreSQLテーブルからランダムな行を選択します

    これでうまくいくはずです:

    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フィドル]



    1. pgadminを使用してherokuデータベースに接続します

    2. SQL ServerがNVarcharフィールドに日本語文字ではなく疑問符文字を格納するのはなぜですか?

    3. OracleのACOS()関数

    4. 一部の集計変換が壊れています