2015-02-21 15 views
8

Bensorgu tablodan rasgele satırları ayıklamak için

Tablo 1 Aşağıdaki 2 tablolar -
her soruların

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 

Tablo için ayrılan soruları ve işaretleri içerir Sorular 2 - Soru Biçimi
Ekstra kaç soru (sayı) içereceğini içerir Ben rastgele sorular masaya masaya [Question_Format] ayarlanan [sayımı] uyarınca [Sorular] alınmayı istiyorum

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

Marks

kümesi için harekete geçti.

cevap

5

İşte fikir. Her bir "mark" için soruları row_number() kullanarak numaralandırın. Sonra rasgele sorular seçmek için bu sıralı numarasını kullanın: Üzerinde katılmak rastgele (işareti başına) soruları sıralayabilir, sonra bir sigara eşitliği olabilir

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

tablo2:

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

'siparişe göre rand()' SQL Server'da beklediğiniz şeyi yapmaz. Rand() 'sorgu başına bir kez değerlendirilir, bu yüzden bir sabit gibi davranır. Bir 'düzen by' ifadesinde, bir sabit deterministik değildir (yani sonucun ne olacağını bilmiyorsunuz), fakat rastgele değildir. Benim deneyimime göre, genellikle "okuma" sırasındaki verileri üretir. –

+0

Beğen @Gordon diyor! Sorguyu düzeltirseniz indirme işlemini kaldırırım. – Andomar

+1

@GordonLinoff Bu yorum için teşekkürler - Ben farkında değildim. Bunun yerine, IIUC 'in yerine kullanacağı newid() 'yi – Mureinik

İlgili konular