如何在保证Y某些特定行在结果中的同时选择X随机行?

Chr*_*ore 7 sql-server random select sql-server-2008

假设一个表结构:

Create Table Question
{
ID int pk,
Category varchar
Stem varchar,
AnswerA varchar,
...
AnswerD varchar,
Correct char,
isMandatory bit

}
Run Code Online (Sandbox Code Playgroud)

对于给定的类别,大约有50个问题.可以有1-10个强制性问题.

我需要随机选择所有必修问题,然后提出足够的其他问题来提出20个问题.

Chr*_*ray 7

好的,这个怎么样

select top 20 * from question
where category = @category
order by isMandatory desc, newid()
Run Code Online (Sandbox Code Playgroud)

请参阅newid后面的推理答案()数据库表中的随机记录(T-SQL)


Mar*_*ith 6

;WITH T 
     AS (SELECT *, 
                ROW_NUMBER() 
                  OVER (PARTITION BY Category 
                            ORDER BY isMandatory DESC, CRYPT_GEN_RANDOM(4)) RN 
         FROM   Question) 
SELECT * 
FROM   T 
WHERE  RN < = 20 
Run Code Online (Sandbox Code Playgroud)