我正在研究调查申请。我有一个sql server数据库,可以容纳多达3000个调查问题。 我将数据库称为一组10个问题。我必须确保在最长的时间内不会重复这些问题。 我能在这里采取什么最好的方法?编写自定义随机算法或SQL服务器提供一些功能。
答案 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,但我会留给你:)
当然,如果你没有重复,直到他们全部被使用,这一点都不重要。