2015-02-21 15 views
8

ho i seguenti 2 tabellequery per estrarre le righe casuali da una tabella

Tabella 1 - Domande
contiene domande e marchi assegnati per ogni domanda

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 

Table 2 - Formato domanda
Contiene quante domande (contare) da estrarre agito per una serie di Marks

Mark | Count 
------------- 
    2 | 2 
    5 | 1 

Voglio che le domande casuali per essere ritirati dal tavolo [Domande] come da [count] fissati nella tabella [Question_Format].

ID |  Question  
---------------------------- 
2 | How old are you?    
3 | Where are you from? 
6 | How was the training session? 

risposta

5

Ecco l'idea. Enumerare le domande per ciascun "segno" utilizzando row_number(). Quindi utilizzare questo numero sequenziale per selezionare le domande casuali:

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; 
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] 

sql fiddle demo

5

Si potrebbe in modo casuale ordinare le domande (per marchio), e poi hanno un non-uguaglianza unirsi su 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 
+4

'order by rand()' non fa ciò che ci si aspetta in SQL Server. 'rand()' viene valutato una volta per query, quindi si comporta come una costante. In un'espressione 'order by', una costante non è deterministica (cioè non si sa quale sarà il risultato), ma non è casuale. Nella mia esperienza, generalmente produce i dati in ordine "letto". –

+0

Come dice @Gordon! Rimuoverò il downvote se correggi la query. – Andomar

+1

@GordonLinoff Grazie per questo commento: non ne ero a conoscenza. Usato 'newid()' invece, quale IIUC, dovrebbe fare il trucco – Mureinik