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

时间:2013-05-28 18:23:40

标签: sql-server stored-procedures

我需要根据另一行的权重从表中选择随机行。就像用户输入随机值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

2 个答案:

答案 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但它可能有效!