查询从表中提取随机行

NIT*_*ESH 8 sql sql-server select stored-procedures sql-server-2008

我有以下2个表

表1 - 问题
包含为每个问题分配的问题和标记

ID| Questions                    | Marks
________________________________________
1 | What is your name?           |  2
2 | How old are you?             |  2
3 | Where are you from?          |  2
4 | What is your father's name?  |  2
5 | Explain about your project?  |  5
6 | How was the training session?|  5
Run Code Online (Sandbox Code Playgroud)

表2 - 问题格式
包含要为一组标记提取的问题(计数)的数量

Mark  | Count
-------------
  2   |    2
  5   |    1
Run Code Online (Sandbox Code Playgroud)

我想根据表[Question_Format]中设置的[count]从表[Questions]中选择随机问题.

 ID |     Question    
 ----------------------------
 2  |   How old are you?             
 3  |   Where are you from? 
 6  |   How was the training session?
Run Code Online (Sandbox Code Playgroud)

Gor*_*off 5

这是个主意.通过使用枚举每个"标记"的问题row_number().然后使用此序号来选择随机问题:

select q.*
from (select q.*,
             row_number() over (partition by marks order by newid()) as seqnum
      from questions q
     ) q join 
     marks m
     on q.marks = m.mark and q.seqnum <= m.count;
Run Code Online (Sandbox Code Playgroud)


Rom*_*kar 5

with cte as (
    select *, row_number() over(partition by Marks order by newid()) as rn
    from Questions
)
select
    q.id, q.Questions
from cte as q
    inner join QuestionFormat as qf on qf.Mark  = q.Marks
where q.rn <= qf.[Count]
Run Code Online (Sandbox Code Playgroud)

sql fiddle demo


Mur*_*nik 5

您可以随机对问题进行排序(每个标记),然后在table2上进行不等式连接:

SELECT id, question
FROM   (SELECT id, question, marks, 
               ROW_NUMBER() OVER (PARTITION BY marks ORDER BY NEWID()) AS rn
        FROM   questions) q
JOIN   question_format qf ON q.marks = qf.mark AND q.rn <= qf.cnt
Run Code Online (Sandbox Code Playgroud)

  • `by rand()`不能满足你对SQL Server的期望.`rand()`每个查询被评估一次,所以它的行为就像一个常量.在`order by`表达式中,常量是非确定性的(即您不知道结果是什么),但它不是随机的.根据我的经验,它通常以"读取"顺序生成数据. (4认同)