2012-06-03 20 views
7

Giả sử cấu trúc bảng:Làm cách nào để chọn X hàng ngẫu nhiên trong khi đảm bảo rằng các hàng nhất định của Y có kết quả?

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

} 

Đối với danh mục nhất định, có khoảng 50 câu hỏi. Có thể có 1-10 câu hỏi bắt buộc.

Tôi cần phải chọn tất cả các câu hỏi bắt buộc, và sau đó đủ các câu hỏi khác một cách ngẫu nhiên để đặt câu hỏi gồm 20 câu hỏi.

+0

Bạn muốn 20 câu hỏi của từng loại? –

+0

Có, nhưng tôi có thể đối phó với điều đó, tôi rất vui nếu tôi nhận được một lần. –

+0

kết nối với 'union' các truy vấn ngẫu nhiên và không ngẫu nhiên của bạn –

Trả lời

7

Ok như thế nào về vấn đề này

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

Xem chấp nhận câu trả lời cho lý do đằng sau newid() Random record from a database table (T-SQL)

+0

Câu trả lời được chấp nhận không đề cập đến 'CRYPT_GEN_RANDOM', được giới thiệu vào năm 2008. Không giống như' RAND', giá trị này được đánh giá mỗi hàng. –

+0

Đây là SQL chưa được kiểm tra, bạn có nói rằng hướng dẫn sẽ giống nhau đối với tất cả các bản ghi và do đó kết quả sẽ không ngẫu nhiên? –

+0

No. 'NEWID()' hoạt động tốt mặc dù tôi không chắc chắn về mức độ ngẫu nhiên thực tế mà nó cung cấp. Đó là vấn đề với sự lựa chọn rõ ràng hơn của 'RAND' (như đã đề cập trong câu trả lời bạn đã liên kết) và tại sao mọi người sử dụng' 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

Bạn chưa khai báo kiểu dữ liệu của' @ 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

Tôi đã quan tâm đến hiệu suất trong 'NEWID()' vs 'CRYPT_GEN_RANDOM (4)', nhưng sắp xếp theo 'CRYPT_GEN_RANDOM (4)' không ngẫu nhiên thứ tự, tôi đang làm gì sai? –

+0

Dưới đây là ví dụ của tôi SQL: –

+0

khai báo bảng dữ liệu @ (val int) chèn vào @ giá trị dữ liệu (1), (2), (3), (4), (5) –

Các vấn đề liên quan