2012-06-03 14 views
7

assumere una struttura di tabella:Come seleziono X righe casuali mentre garantisco che Y determinate righe specifiche sono nel risultato?

Create Table Question 
{ 
ID int pk, 
Category varchar 
Stem varchar, 
AnswerA varchar, 
... 
AnswerD varchar, 
Correct char, 
isMandatory bit 

} 

per una determinata categoria, ci sono circa 50 domande. Ci possono essere 1-10 domande obbligatorie.

Devo selezionare tutte le domande obbligatorie e quindi abbastanza altre domande a caso per creare una serie di domande di 20 domande.

+0

You want 20 domande di ogni categoria? –

+0

Sì, ma posso occuparmene, sono felice se ne ottengo uno alla volta. –

+0

connettersi con 'union' le tue query casuali e non casuali –

risposta

7

Ok come su questo

select top 20 * from question 
where category = @category 
order by isMandatory desc, newid() 

Sede ha accolto risposta per ragionamento dietro newid() Random record from a database table (T-SQL)

+0

La risposta accettata non menziona 'CRYPT_GEN_RANDOM', introdotta nel 2008. A differenza di' RAND' questa viene valutata per riga. –

+0

Questo è SQL non verificato, stai dicendo che il guid sarebbe lo stesso per tutti i record, e quindi il risultato non sarebbe casuale? –

+0

No. 'NEWID()' funziona bene anche se non sono sicuro del grado effettivo di casualità che offre. Questo è il problema con la scelta più ovvia di 'RAND' (come menzionato nella risposta che hai linkato) e perché le persone ricorrono all'uso di' NEWID'. –

0
Declare @number_of_nonmandat INT 

    Select @number_of_nonmandat=count(1) 
    FROM Question 
    where isMandatory =1 

    SET @number_of_nonmandat=20-number_of_nonmandat; 

    IF(@number_of_nonmandat>0) 
    BEGIN 
     Select * 
     FROM Question 
     where isMandatory =1 
      UNION 
     SELECT TOP (@number_of_nonmandat) * 
     FROM Question 
     where isMandatory<>1 
     ORDER BY newID() 
    END 
    ELSE 
    BEGIN 
     Select top 20 * 
     FROM Question 
     where isMandatory =1 

    END 
+0

Non hai dichiarato il tipo di dati di' @ number_of_nonmandat'. – Bridge

6
;WITH T 
    AS (SELECT *, 
       ROW_NUMBER() 
        OVER (PARTITION BY Category 
          ORDER BY isMandatory DESC, CRYPT_GEN_RANDOM(4)) RN 
     FROM Question) 
SELECT * 
FROM T 
WHERE RN < = 20 
+0

Mi interessava la performance nel 'NEWID()' vs 'CRYPT_GEN_RANDOM (4)', ma l'ordine di 'CRYPT_GEN_RANDOM (4)' non randomizza l'ordine, cosa sto facendo male? –

+0

Ecco il mio esempio SQL: –

+0

declare @ data table (valint) ; inserire in @ i valori dei dati (1), (2), (3), (4), (5) –

Problemi correlati