【问题标题】:Returning random rows that are evenly spread over a grouping返回均匀分布在分组中的随机行
【发布时间】:2014-09-27 19:57:18
【问题描述】:

我正在创建一些考试软件,我必须在其中为每个学生选择随机问题,每个科目的章节中都有特定数量的问题。

例如,数学科目分为 12 章,我想要 50 个随机问题,每章至少有 3 个问题。

到目前为止,我有以下查询,它给了我 50 个随机问题。

SELECT TOP 50 Q.ID, Q.Subject_name, Q.Chapter 
FROM  Questions Q 
WHERE 50 >= RAND() * (SELECT MAX(25) FROM Questions Q)

【问题讨论】:

  • 他想要一组随机的 50 行/问题,每章至少有 3 个。很清楚。

标签: sql-server tsql sql-server-2005


【解决方案1】:

您可以使用ROW_NUMBER 为每章的每个问题生成一个序号。最重要的是,要获得随机行,您可以为每一行生成一个NEWID,用于对行进行排序:

SELECT TOP 50 Q.ID, Q.Chapter , 
       ROW_NUMBER() OVER(PARTITION BY Chapter ORDER BY NEWID()) AS Row
FROM questions Q
ORDER BY Row

每次运行时,您将获得 50 个随机行,这些行均匀分布在各个章节中。

Working SQL Fiddle

【讨论】:

  • 使用 order by (ROW_NUMBER) 是获得请求权重的好方法。
  • 谢谢。这是我能想到的最好的方法。不错的小挑战 :-)
  • @Tanner:这不能保证每章有 3 个问题。它只提供随机章节中的 50 个随机问题,理论上它们可以都属于同一章节。
  • @Quandary 想解释一下为什么您认为您的陈述是真实的?我非常有信心它会起作用。
  • 非常感谢 Tanner 的帮助。我刚刚崩溃了我的服务器。无法测试您的代码。等我把服务器拿回来,会回复你的,再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-08
  • 1970-01-01
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
  • 2020-04-04
  • 2011-03-02
相关资源
最近更新 更多