1

別の行の重みに基づいて、テーブルからランダムな行を選択する必要があります。ユーザーがランダムな値 50 を入力した場合のように、テーブルから 50 個のランダムな行を選択する必要があります。これは、重みの高い行がより多くの回数返されるためです。NEWID() を使用して n 個のランダムな行を選択し、このリンクを見ました

T-SQL でのランダム加重選択

別の行からの重みに基づいて1つの行を選択できますが、ユーザーのランダムな入力番号に基づいて複数の行を選択する必要があるため、上記のリンクで提案された回答を使用してn回ループするのが最善の方法です(しかし、同じ行が返されると思います)他に簡単な解決策はありますか?

私のテーブルはこんな感じ

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

したがって、ユーザーが 50 を入力すると、50 のランダムな名前を返す必要があるため、ccc よりも aaa ,bbb のようになるはずです.25 aaa 15 bbb と 10 ccc のようになるかもしれません. これに近いものはすべて機能します。この回答を見ましたが、DB に対して実行すると、5 分間実行され、まだ結果が得られないようです。 SQL : 1 行をランダムに選択しますが、重みを考慮します

4

2 に答える 2

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
于 2013-05-28T20:20:45.263 に答える
0

たぶん、次のようなことを試してみてください:

ORDER BY Freq * rand()

あなたのSQLで?したがって、Freq 値が高い列は、理論的には、Freq 値が低い列よりも頻繁に返されるはずです。少しハックに思えますが、うまくいくかもしれません!

于 2013-05-28T18:51:20.793 に答える