Sql 使用加权机会从数据库中取出项目

Sql 使用加权机会从数据库中取出项目,sql,database,temp-tables,Sql,Database,Temp Tables,假设我有一个满表的记录,我想从中随机抽取记录。但是,我希望该表中的某些行比其他行显示得更频繁(哪些行因用户而异)。使用SQL最好的方法是什么 我能想到的唯一方法是创建一个临时表,用我希望更常见的行填充它,然后用表中其他随机选择的行填充它。有更好的方法吗?我能想到的一种方法是在表中创建另一列,该列是权重的滚动和,然后通过生成一个介于0和所有权重总和之间的随机数来提取记录,并提取滚动和值最高的行小于随机数 例如,如果有四行具有以下权重: +---+--------+------------+ |ro

假设我有一个满表的记录,我想从中随机抽取记录。但是,我希望该表中的某些行比其他行显示得更频繁(哪些行因用户而异)。使用SQL最好的方法是什么


我能想到的唯一方法是创建一个临时表,用我希望更常见的行填充它,然后用表中其他随机选择的行填充它。有更好的方法吗?

我能想到的一种方法是在表中创建另一列,该列是权重的滚动和,然后通过生成一个介于0和所有权重总和之间的随机数来提取记录,并提取滚动和值最高的行小于随机数

例如,如果有四行具有以下权重:

+---+--------+------------+
|row| weight | rollingsum |
+---+--------+------------+
| a |      3 |          3 |
| b |      3 |          6 |
| c |      4 |         10 |
| d |      1 |         11 |  
+---+--------+------------+

然后,选择一个介于0和11之间的随机数
n
,如果
0,则返回行
a
,我不知道单用SQL很容易做到这一点。使用T-SQL或类似工具,您可以编写循环来复制行,也可以使用SQL生成执行行复制的指令

我不知道你的概率模型,但你可以用这样的方法来实现后者。根据这些表格定义:

RowSource
---------
RowID

UserRowProbability
------------------
UserId
RowId
FrequencyMultiplier
您可以编写如下查询(特定于SQL Server):


这将考虑选择一组随机的行以及重复多少行。然后,在应用程序逻辑中,您可以执行行复制并洗牌结果。

从3个表开始:用户、数据和用户数据。用户数据包含每个用户应首选的行

然后根据用户首选的数据行创建一个视图

创建具有非首选数据的第二个视图

创建第三个视图,它是前两个视图的并集。联合应从首选数据中选择更多行


最后从第三个视图中选择随机行。

Woah,太棒了!谢谢,看来这是最好的办法。正如设拉子所建议的那样,我必须将它与视图结合起来,因为我希望每个用户的权重都不同(这会有问题吗?),但如果不是这样的话,效果会很好。
SELECT TOP 100 rs.RowId, urp.FrequencyMultiplier
FROM RowSource rs
  LEFT JOIN UserRowProbability urp ON rs.RowId = urp.RowId
ORDER BY ISNULL(urp.FrequencyMultiplier, 1) DESC, NEWID()