1

列と確率を持つSQLテーブルがあります。ランダムに1行を選択したいのですが、より多くの確率でより多くのチャンスを与えたいと思います。私はこれを行うことができます

    Order By abs(checksum(newid()))

しかし、確率の差が大きすぎるため、確率が最も高くなる可能性が高くなります。その値の74倍を選択した後、別の値をもう一度約74回取得します。これを減らしたいです。3〜4回必要です。それにそして他の人よりもそしてすべて。確率に範囲を与えることを考えています。

    Row[i] = Row[i-1]+Row[i]

これを行うにはどうすればよいですか。関数を作成する必要がありますか?これを実現する他の方法はありますか?私はneewbyです。助けが必要です。ありがとうございます。

編集: 私は私の問題の解決策を持っています。一つ質問があります 。次のようなテーブルがある場合。

    Column1   Column2
     1         50
     2         30
     3         20

入手できますか?

    Column1   Column2  Column3
     1         50       50
     2         30       80
     3         20       100

既存のものに付加価値をつけたいと思う度に何かありますか?

更新: 3時間後に最終的に解決策を取得します。確率の平方根を取得するだけで、それらの差を狭めることができます。これは、列を追加するようなものです。

    sqrt(sqrt(sqrt(Probability)))....:-)
4

4 に答える 4

0

私はそれを次のようなもので処理します

ORDER BY rand()*pow(<probability-field-name>,<n>)

nの値が異なると、線形確率が単純な多項式に歪められます。nの値が小さい(例:0.5)と、確率が1に圧縮されるため、可能性の低い選択が可能になります。nの値が大きい(例:2)と、逆になり、すでに可能性の低い値の確率がさらに低くなります。

于 2011-12-22T17:39:20.367 に答える
0

確率の差が大きすぎるため、より均一な確率分布を持つ修正された重み付けを使用して計算フィールドを追加する必要があります。それをどのように行うかは、データと優先配布によって異なります。これを行う1つの方法は、重みを1〜10の整数に「正規化」して、最低の確率が最高の確率の10分の1を超えないようにすることです。

于 2011-12-22T17:40:44.253 に答える
0

最近の質問への回答:

SELECT t.Column1, 
       t.Column2,
       (SELECT SUM(Column2) 
        FROM table t2
        WHERE t2.Column1 <= t.Column1) Column3
FROM table t
于 2011-12-22T18:38:20.460 に答える
0

これは、割り当てられた行の重みを考慮して、テーブルから1つの行を選択する方法の基本的な例です。

テーブルがあるとします。

CREATE TABLE TableWithWeights(
  Id int NOT NULL PRIMARY KEY,
  DataColumn nvarchar(50) NOT NULL,
  Weight decimal(18, 6) NOT NULL -- Weight column
) 

表にサンプルデータを入力してみましょう。

INSERT INTO TableWithWeights VALUES(1, 'Frequent', 50)
INSERT INTO TableWithWeights VALUES(2, 'Common', 30)
INSERT INTO TableWithWeights VALUES(3, 'Rare', 20)

これは、指定された行の重みを考慮して1つのランダムな行を返すクエリです。

SELECT * FROM
   (SELECT tww1.*,     -- Select original table data
     -- Add column with the sum of all weights of previous rows
     (SELECT SUM(tww2.Weight)- tww1.Weight  
      FROM TableWithWeights tww2
      WHERE tww2.id <= tww1.id) as SumOfWeightsOfPreviousRows
    FROM TableWithWeights tww1) as tww,
    -- Add column with random number within the range [0, SumOfWeights)
    (SELECT RAND()* sum(weight) as rnd    
     FROM TableWithWeights) r 
WHERE  
         (tww.SumOfWeightsOfPreviousRows <= r.rnd) 
     and ( r.rnd < tww.SumOfWeightsOfPreviousRows + tww.Weight) 

クエリ結果を確認するために、100回実行できます。

DECLARE @count as int;
SET @count = 0;
WHILE ( @count < 100)
BEGIN
    -- This is the query that returns one random row with
    -- taking into account given row weights
    SELECT * FROM
       (SELECT tww1.*,     -- Select original table data
         -- Add column with the sum of all weights of previous rows
         (SELECT SUM(tww2.Weight)- tww1.Weight  
          FROM TableWithWeights tww2
          WHERE tww2.id <= tww1.id) as SumOfWeightsOfPreviousRows
        FROM TableWithWeights tww1) as tww,
       -- Add column with random number within the range [0, SumOfWeights)
       (SELECT RAND()* sum(weight) as rnd    
        FROM TableWithWeights) r 
    WHERE  
         (tww.SumOfWeightsOfPreviousRows <= r.rnd) 
     and ( r.rnd < tww.SumOfWeightsOfPreviousRows + tww.Weight) 

    -- Increase counter
    SET @count += 1
END 

PSクエリはSQLServer2008R2でテストされました。そしてもちろん、クエリは最適化できます(アイデアがわかれば簡単に実行できます)

于 2011-12-22T20:39:26.200 に答える