1

我需要根据另一行的权重从表中选择随机行。就像用户输入随机值 50 一样,我需要从表中选择 50 个随机行,因为权重较高的行返回的次数更多。我看到使用 NEWID() 来选择 n 个随机行和这个链接

T-SQL 中的随机加权选择

我们可以根据另一行的权重选择一行,但我需要根据用户随机输入数选择几行,所以最好的方法是使用上面链接中的建议答案并循环 n 次(但我认为它会返回同一行)还有其他简单的解决方案吗?

我的桌子是这样的

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

所以当用户输入 50 时,我需要返回 50 个随机名称,所以它应该比 ccc 更多 aaa ,bbb 。可能像 25 aaa 15 bbb 和 10 ccc。任何与此接近的东西都可以。我看到了这个答案,但是当我对我的数据库执行时,它似乎运行了 5 分钟并且还没有结果。 SQL:随机选择一行,但要考虑权重

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 回答