2013-05-28 37 views
1

我需要根據另一行中的權重從表中選擇隨機行。就像用戶輸入隨機值50一樣,我需要從表中選擇50個隨機行,即權重更高的行會返回更多次數。只見使用NEWID()來選擇隨機行中的n個與此鏈接根據另一行上的權重選擇隨機行

Random Weighted Choice in T-SQL

,我們可以根據來自另一行的權重選擇一個行,但我需要選擇多行基於用戶的隨機輸入數字,所以最好的方法是在上面的鏈接中使用建議的答案並循環使用n次(但我認爲它會返回同一行)是否還有其他簡單的解決方案。

我的表是這樣的

ID Name Freq 
1 aaa 50 
2 bbb 30 
3 ccc 10 

所以當用戶輸入50我需要返回50個隨機名的,所以應該像更AAA,BBB比ccc.Might像25 AAA BBB 15和10 CCC。任何接近此的工作將會奏效。我看到了這個答案,但是當我對我的數據庫執行時,它似乎在運行5分鐘並且沒有結果。 SQL : select one row randomly, but taking into account a weight

+0

以下內容是什麼意思? '...因爲體重較高的行會被返回更多次數。' –

+0

@AbeMiessler在問題中添加了更多解釋,謝謝 – Lav

+0

我編輯了您的標題。請參閱:「[應該在其標題中包含」標籤「](http://meta.stackexchange.com/questions/19190/)」,其中的共識是「不,他們不應該」。 –

回答

2

我認爲這裏的困難部分是讓任何一行可能出現不止一次。我會考慮做如下的事情:

1)建立一個臨時表,根據它們的頻率複製記錄(我相信有這樣做的更好方法,但是我想到的第一個答案是一個簡單的while循環...這尤其是一個真的只有工作,如果頻率值是整數)

create table #dup 
(
    id int, 
    nm varchar(10) 
) 

declare @curr int, @maxFreq int 
select @curr=0, @maxFreq=max(freq) 
from tbl 

while @curr < @maxFreq 
begin 
    insert into #dup 
    select id, nm 
    from tbl 
    where freq > @curr 

    set @curr = @curr+1 
end 

2)選擇您最記錄,通過隨機值

select top 10 * 
from #dup 
order by newID() 

3)清除訂購

drop table #dup 
+0

謝謝!我認爲現在我可以使用這種解決方案只有一件事是隨機選擇再次超過溫度表不會返回最大優化results.Hoping改善它在C#端,如果我找到一些sol – Lav

+1

@Lav,你是什麼意思「優化結果「?如果結果是隨機的,您不會總是根據權重獲得均勻分佈。但是,結果集中重量較高的行比重量較低的行更有可能發生。 – chezy525

+0

是的,你是正確的,當我正在執行這個我認爲iam不總是最大頻率的id,但這就是隨機意味着我想:-) – Lav

0

也許你可以嘗試類似如下:在您的SQL

ORDER BY Freq * rand() 

?因此,具有較高Freq值的列在理論上應該比具有較低Freq值的列更經常返回。這看起來有點駭人聽聞,但它可能工作!

+0

我的第一個想法也是,但要求是同一行應該能夠按頻率多次返回。這隻會允許它返回一次。 –

+0

這不會選擇頻率更高的行,它只會返回隨機值。Freq並不是數值出現在表格中的次數,而是描述該行重量的另一列。因此,即使頻率爲3000,該行在表格中未出現3000次以便頻繁選擇。 – Lav

+0

我不認爲你可以任意複製MySQL中的行,所以如果這是需求,MySQL不是解決方案。而應該使用PHP。這也不會選擇隨機行。它選擇(隨機x Freq)。由於給定2個隨機但相等的值,如果freq較低,rand()返回一個隨機float [0 ... 1],所以higer freq獲勝。這是我的意圖。 – beiller