根据另一行的权重选择随机行



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

T-SQL中的随机加权选择

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

我的表是这样的

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

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

我认为这里困难的部分是让任何单独的行可能出现多次。我想考虑做以下事情:

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

也许你可以试试这样做:

ORDER BY Freq * rand()

在sql?因此,从理论上讲,具有较高频率值的列应该比具有较低频率值的列更频繁地返回。这看起来有点俗气,但可能有用!

最新更新