来自sql server的随机问题

时间:2010-07-20 19:32:45

标签: sql-server random

我正在研究调查申请。我有一个sql server数据库,可以容纳多达3000个调查问题。 我将数据库称为一组10个问题。我必须确保在最长的时间内不会重复这些问题。 我能在这里采取什么最好的方法?编写自定义随机算法或SQL服务器提供一些功能。

5 个答案:

答案 0 :(得分:1)

您可以简单地跟踪检索到的最后一个问题ID。然后始终检索ID高于上一个的下一个问题。如果没有返回任何内容,请获取第一个/最低。

它不能很好地扩展,但它听起来并不像你需要扩展。

答案 1 :(得分:0)

SELECT question_id
FROM questions 
ORDER BY NEWID()

以随机顺序为您提供所有问题ID。存储列表,然后逐步减少。

如果不存储订单,则无法确保重复之间的最长时间。你可以把它放在同一张桌子上的另一栏......

编辑:雅克先生的想法的一个变种:

一个名为random的列怎么样?按顺序洗牌顺序:

update questions set random = (
    SELECT question_id
    FROM questions 
    ORDER BY NEWID()
)

然后得到每个新问题:

select * where random = 'prev_question_id';

然后你可以每隔一段时间对这个顺序进行一次洗牌。

答案 2 :(得分:0)

实际上,获得随机设置只是问题的一半。你真正想要的是一个新的随机集,其中包含之前未被选中的条目。

以下是杰夫阿特伍德撰写的一篇文章,其中讨论了可能对您有所帮助的“改组”:Shuffling和后续文章The Danger of Naïveté

答案 3 :(得分:0)

您可以根据问题本身的随机生成器和频率计数器的组合来选择问题。

如果您总是需要10个问题,请从一组使用频率最低的问题开始,然后应用随机数生成器从该组中挑选。增加这些问题的频率。这些最近提出的问题具有比池的其余部分更高的频率,因此在下一轮中忽略这些问题。

此过程一直持续到您将所有问题都转到下一个频率,整个池再次可用。

答案 4 :(得分:0)

这种听起来像是家庭作业..如果强调真的是确保问题从不重复,直到绝对必要,那么我建议添加一个列或另一个带有TimesUsed字段的表。

首先,你将拥有所有3000条记录,其TimesUsed为0.抢占前10名

SELECT TOP 10 QUESTIONS WHERE TimesUsed = (SELECT MIN(TimesUsed) FROM Questions)

并更新表格,将这些问题的TimesUsed设置为TimesUsed +1。

这是一个简单的方法,你需要考虑一下,如果你没有一定数量的问题可以平均分为10,但我会留给你:)

当然,如果你没有重复,直到他们全部被使用,这一点都不重要。