2011-12-22 14 views
1

私は列と確率を持つSQLテーブルを持っています。私はランダムにそれから一つの行を選びたいと思っていますが、私はより多くの確率でより多くの確率を与えたいと思っています。私はSQLの列に範囲を与える

Order By abs(checksum(newid())) 

によってこれを行うことができます。しかし、それはそれは一度周りに再びより74 times.Iために別の値を拾う価値74回を選ん後最高probability.Likeへのより多くのチャンスを与えるように、確率の違いはあまりありこれを減らしたいと思っています。私はそれを他のものよりも3〜4倍したいのです。私は関数を作成する必要があり、この.doという操作を行うことができますどのように?どんなそこにある

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

同様Probabilies.Itsにthis.I午前neewby.Any助けを達成するための他の方法で範囲を与えることを考えていますありがとうございます。ありがとうございます。

EDIT: 私は私の問題の解決方法を持っています。一つの質問があります 。 次のような表がある場合。

Column1 Column2 
    1   50 
    2   30 
    3   20 

を入手できますか?

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

既存の値を追加するたびに、何か方法がありますか?

UPDATE: は最後に、私はちょうど私が.ITは私が

sqrt(sqrt(sqrt(Probability)))....:-) 
+0

これを明確にするために、column3は、他のすべての(前の)エントリと2番目の列の(現在の)値の合計にする必要があります。 ?それは悪い考えではありません。しかし、あなたはそれをどのように生成するのだろうか?いくつかの方法がありますが、私は何が最高になるか分かりません。私が持っている最大の質問は、すべての値を挿入した後にテーブルが静的であるかどうかです。 – JayC

+0

ああ、私はDNNXが同じ理解で答えたと思う。 – JayC

答えて

0

Iカラムを追加しているようにそれらBW違いを狭めることができる方法私のprobailitiesの平方根を取る、3時間後に解を得ます「あなたは、簡単な多項式に線形確率を歪めるだろうn個の異なる値に対して

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

のようなもので、それを扱うdは。 n(例えば、0.5)の小さな値は確率を1に圧縮し、従って可能性の高い選択肢をより可能性の高いものにし、n(例えば2)の大きな値は反対を行い、既に考えられない値の確率をさらに低下させる。

+0

私はこのpowがPOWER機能であると理解しています。私はそれを試しました。別の行を得るたびに、それは私のすべてのクリックに対して同じになるでしょう。また、選択した行を変更したい。 – Hiren

0

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

0

回答:ここで

SELECT t.Column1, 
     t.Column2, 
     (SELECT SUM(Column2) 
     FROM table t2 
     WHERE t2.Column1 <= t.Column1) Column3 
FROM table t 
+0

テーブルt2はどこですか? – Hiren

+0

't'と' t2'はテーブル 'テーブル'のエイリアスです。彼らは同じ元のテーブルを参照します。 – DNNX

+0

ああ私はそれを得た。ありがとう、私は試みるつもりです。 – Hiren

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) 

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

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クエリはSQL Server 2008 R2でテストされました。

関連する問題