Sql server 我想从每个类别的表格中随机选择问题
需要SQL Server 2005查询,请帮助 我有一个有问题的表格,所有问题都按主题分类 另一个表包含主题及其在主题中的数字权重 现在,我需要从表Sql server 我想从每个类别的表格中随机选择问题,sql-server,database,sql-server-2005,random,Sql Server,Database,Sql Server 2005,Random,需要SQL Server 2005查询,请帮助 我有一个有问题的表格,所有问题都按主题分类 另一个表包含主题及其在主题中的数字权重 现在,我需要从表问题中选择50个随机问题,这些问题基于主题的权重,就像50个随机选择的问题中必须有 5 questions from Subtopic_Id=1 and 15 questions from Subtopic_Id=2 and 10 questions from Subtopic_Id=3 and 10 questions from Sub
问题中选择50个随机问题,这些问题基于主题的权重,就像50个随机选择的问题中必须有
5 questions from Subtopic_Id=1 and
15 questions from Subtopic_Id=2 and
10 questions from Subtopic_Id=3 and
10 questions from Subtopic_Id=4 and
10 questions from Subtopic_Id=5
请参见第二幅图(表主题)
而且主题的数量及其权重在不同的主题中可能会有所不同,所以union语句对于动态查询来说是个坏主意
我甚至还没有为这个选择找到一行代码 除了使用动态sql,对于每个子主题,使用order by rand进行查询并获取top x编号之外,我真的看不到任何其他方法。您可以在top子句中使用列值。这不是常识,但可以做到
select * from (select Top 5 *
from questions where subtopic_id=1
order by NEWID())a1
union
select * from (
select Top 10 *
from questions where subtopic_id=2
from dbo.spegg_AtgPrice_Diff
order by NEWID())
a2
and so on
您可以使用TOP子句中的TopicWeightage
列
这是可以做到的,但只是很少有机会编写这样的查询。您恰好处于这种情况下,因此解决方案类似于
SELECT Q.ExamQ_ID
FROM TopicTable t
CROSS APPLY (
SELECT TOP (t.TopicWeightage) ExamQ_ID
FROM Questions
WHERE SubjTopicID = t.SubjTopic_ID
ORDER BY NEWID()
) Q(ExamQ_ID)
亲爱的本杰明,共有10个主题,每个主题都有不同数量的主题,如图中有5个主题,但有一个主题有10个主题。所以union语句不会创建一个混乱的代码。这将是一个非常糟糕的查询,因为您将查看整个表中所有的主题类型。另外,如果你有50个主题类型,谁会编写这个查询:)为5个主题创建它将需要另外3次剪切和粘贴。这似乎是一个一次性的项目。如果它是重复出现的,我会建议在子主题id上建立一个索引,然后它会运行得很快。我看不到“第二张图片”,所以我不知道请求者所说的“不同主题的主题数量及其权重可能不同”是什么意思。@JamshaidRiaz基本上,本杰明·莫斯科维茨的答案中包含了什么,但将其创建为带查询的文本字符串,然后在该字符串上使用exec非常感谢@M.Ali,这太棒了。