我需要根据另一行的权重从表中选择随机行。就像如果用户输入随机值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?因此,从理论上讲,具有较高频率值的列应该比具有较低频率值的列更频繁地返回。这看起来有点俗气,但可能有用!