2015-02-21 7 views
8

Ich habe die folgenden zwei TabellenAbfrage zu extrahieren zufällige Zeilen aus einer Tabelle

Tabelle 1 - Fragen
für die einzelnen Fragen

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 

Tabelle

zugeteilt Fragen und Marken Enthält 2 - Frageformat
Enthält wie viele Fragen (Anzahl) zu extrahieren sind für eine Reihe von Marken gehandelt

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

ich die zufälligen Fragen will aus der Tabelle abgeholt werden [Fragen] gemäß dem [count] in der Tabelle [Question_Format].

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

Antwort

5

Hier ist die Idee. Zählen Sie die Fragen für jede "Markierung" auf, indem Sie row_number() verwenden. Dann diese laufende Nummer verwenden, um die zufälligen Fragen zu wählen:

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

Sie zufällig auf die Fragen (pro Marke) sortieren können, und dann haben eine nicht-Gleichheit verbinden auf 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

'Reihenfolge von rand()' tut nicht, was Sie in SQL Server erwarten. 'rand()' wird einmal pro Abfrage ausgewertet, also verhält es sich wie eine Konstante. In einem Ausdruck 'order by' ist eine Konstante nicht deterministisch (d. H. Sie wissen nicht, wie das Ergebnis aussehen wird), aber sie ist nicht zufällig. Meiner Erfahrung nach erzeugt es im Allgemeinen die Daten in "Lese" -Reihenfolge. –

+0

Wie @Gordon sagt! Ich werde Downvote entfernen, wenn Sie die Abfrage beheben. – Andomar

+1

@GordonLinoff Danke für diesen Kommentar - ich war mir dessen nicht bewusst. Benutzte 'newid()' stattdessen, was IIUC, sollte der Trick – Mureinik

Verwandte Themen