2015-02-21 17 views
8

mam następujące 2 stołyzapytania wyodrębnić losowe wierszy z tabeli

Tabela 1 - Pytania
zawiera pytania i znaki przydzielone dla każdego pytania

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 

Stołowych 2 - Format pytania:
Zawiera liczbę pytań do zliczenia działał dla zestawu znaków

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

chcę losowe pytania należy odebrać od stołu [pytania] Jak na [ilość] określone w tabeli [Question_Format].

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

Odpowiedz

5

Oto pomysł. Wymień pytania dla każdego "znaku", używając row_number(). Następnie użyj tego numeru sekwencyjnego wybrać losowo pytania:

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

Można losowo sortowania pytania (za znakiem), a następnie mieć non-równości dołączyć na 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()' nie robi tego, czego się spodziewasz w SQL Server. 'rand()' jest oceniane raz na zapytanie, więc zachowuje się jak stała. W wyrażeniu 'order by', stała jest niedeterministyczna (tzn. Nie wiadomo, jaki będzie wynik), ale nie jest przypadkowa. Z mojego doświadczenia wynika, że ​​generuje dane w kolejności "odczytywania". –

+0

Jak mówi @Gordon! Usuwam downvote, jeśli rozwiążesz zapytanie. – Andomar

+1

@GordonLinoff Dzięki za ten komentarz - nie wiedziałem o tym. Zamiast tego użył 'newid()', który IIUC powinien obsłużyć: – Mureinik