我需要根据另一行的权重从表中选择随机行。就像用户输入随机值50一样,我需要从表中选择50个随机行,即权重较高的行返回的次数更多。我看到使用NEWID()来选择n个随机行和这个链接
Random Weighted Choice in T-SQL
我们可以根据另一行的权重选择一行,但我需要根据用户的随机输入数选择几行,所以最好的方法是使用上面链接中的建议答案并循环遍历数字时间(但我认为它会返回同一行)是否还有其他简单的解决方案。
我的桌子就像这样
ID Name Freq
1 aaa 50
2 bbb 30
3 ccc 10
所以当用户输入50时我需要返回50个随机名称,所以它应该像aaa,bbb比ccc更多。可能像25 aaa 15 bbb和10 ccc。任何接近这个的东西都可以工作。我看到了这个答案,但是当我对我的数据库执行时,它似乎运行了5分钟但还没有结果。 SQL : select one row randomly, but taking into account a weight
答案 0 :(得分:2)
我认为这里的困难部分是让任何一行都可能出现不止一次。我会考虑做以下事情:
1)建立一个临时表,根据频率复制记录(我确信有更好的方法可以做到这一点,但我想到的第一个答案是一个简单的循环...这个特别的真的仅在频率值为整数时才有效
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
答案 1 :(得分:0)
也许您可以尝试以下内容:
ORDER BY Freq * rand()
在你的SQL中?因此,具有较高Freq值的列理论上应该比具有较低Freq值的列更频繁地返回。它看起来有点hackish但它可能有效!