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

SQLでランダムにバイアスされていますか?

    行ごとに乱数を生成し、重みを付ける必要があります。

    この場合、RAND(CHECKSUM(NEWID())) RANDの「クエリごと」の評価を回避します 。次に、それをブーストで乗算し、結果のDESCで順序付けします。 SUM..OVER トータルブーストを提供します

    DECLARE @sample TABLE (id int, boost int)
    
    INSERT @sample VALUES (1, 1), (2, 2), (3, 7)
    
    SELECT
        RAND(CHECKSUM(NEWID())) * boost  AS weighted,
        SUM(boost) OVER () AS boostcount,
        id
    FROM
        @sample
    GROUP BY
        id, boost
    ORDER BY
        weighted DESC
    

    ブースト値が大きく異なる場合(あなたが言及したと思います)、分散をスムーズにするためにLOG(ベースe)を使用することも検討します。

    最後に、ORDER BY NEWID()は、ブーストを考慮しないランダム性です。 RANDをシードすることは便利ですが、それ自体ではできません。

    このサンプルは、SQL Server 2008、ところで

    にまとめられました。

    1. DLL'SqlServerSpatial.dll'を読み込めません

    2. OPENJSONを使用してSQLServerでネストされたJSONを選択する方法

    3. より高度なクエリを実行しているときにオブジェクトが閉じている場合、操作は許可されません

    4. シーケンスオブジェクトからデータベースで生成されたIDを使用したOracleViewの作成