2013-07-25 2 views
0

У меня есть эта таблица QUESTIONS, которая имеет 500 записей со следующими столбцами:SQL выбора случайных записей для выполнения категории

Q_ID 
Q_difficulty('easy','medium','hard') 
Q_subject('MATH','SCIENCE','LANGUAGE','HISTORY') 
Question(the actual question) 

мне нужно получить 100 случайных записи, состоящие из 20 легко, 60 средних и 20 трудно, но Я должен рассмотреть вопрос о получении 25% каждого предмета.

Я знаю, как получить легкий, средний и жесткий, выполнив:

go 
select top 20 from QUESTIONS where Q_difficulty='easy' order by NEWID() 
go 
select top 60 from QUESTIONS where Q_difficulty='medium' order by NEWID() 
go 
select top 20 from QUESTIONS where Q_difficulty='hard' order by NEWID() 

Моя проблема заключается в том, как сделать запрос у 25% каждого субъекта. Im используя сервер SQL, кстати :(

+0

вам нужны предметы равномерно распределены между легкой, средней и жесткие вопросы Есть ? – ErikE

+0

@ErikE Нет, он хочет в соотношении ** 'easy: medium: hard = 1: 3: 1' ** и **' Math: Sceience: Language: History = 1: 1: 1: 1' ** – Luv

+0

Нет необходимости. Мне просто нужно убедиться, что у меня есть 25% каждого предмета и соотношение 20:60:20 сложности – user1625766

ответ

1
SELECT 
    X.* 
FROM 
    (VALUES 
     ('easy', 5), ('medium', 15), ('hard', 5) 
    ) D (Difficulty, Qty) 
    CROSS JOIN (VALUES 
     ('MATH'), ('SCIENCE'), ('LANGUAGE'), ('HISTORY') 
    ) S (Subject) 
    CROSS APPLY (
     SELECT TOP (D.Qty) 
     Q.* 
     FROM 
     dbo.Questions Q 
     WHERE 
     D.Difficulty = Q.Difficulty 
     AND D.Subject = Q.Subject 
     ORDER BY 
     NewID() 
    ) X 
+0

Что означает X? А также что такое Cross Join и Cross Apply? – user1625766

+0

'X' - это псевдоним таблицы, назначенный производной таблице в скобках непосредственно перед ней. 'CROSS JOIN' означает объединение без условия корреляции, приводящее к декартовому произведению, также иногда называемое кросс-произведением. В этом случае я объединил три производные таблицы (ни один из них не ссылается непосредственно на реальную таблицу, но имеет запрос в круглых скобках). 'CROSS APPLY' вводит таблицу или подзапрос, который не является экспликацией, объединенной с предложением' ON' (аналогично 'CROSS JOIN'), но ему разрешено иметь внешние ссылки (где, например, в таблице' X' он может ссылаться на столбцы из стол D. – ErikE

0

Вам придется разбить его на отдельные проценты:

select top 5 * INTO #tmp from QUESTIONS where Q_difficulty='easy' AND Q_subject='MATH' order by NEWID(); 
INSERT INTO #tmp 
select top 5 * from QUESTIONS where Q_difficulty='easy' AND Q_subject='SCIENCE' order by NEWID(); 
INSERT INTO #tmp 
select top 5 from QUESTIONS where Q_difficulty='easy' AND Q_subject='LANGUAGE' order by NEWID(); 
INSERT INTO #tmp 
select top 5 from QUESTIONS where Q_difficulty='easy' AND Q_subject='HISTORY' order by NEWID(); 
INSERT INTO #tmp 
select top 15 from QUESTIONS where Q_difficulty='medium' AND Q_subject='MATH' order by NEWID(); 
INSERT INTO #tmp 
select top 15 from QUESTIONS where Q_difficulty='medium' AND Q_subject='SCIENCE' order by NEWID(); 
INSERT INTO #tmp 
select top 15 from QUESTIONS where Q_difficulty='medium' AND Q_subject='LANGUAGE' order by NEWID(); 
INSERT INTO #tmp 
select top 15 from QUESTIONS where Q_difficulty='medium' AND Q_subject='HISTORY' order by NEWID(); 
INSERT INTO #tmp 
select top 5 from QUESTIONS where Q_difficulty='hard' AND Q_subject='MATH' order by NEWID(); 
INSERT INTO #tmp 
select top 5 from QUESTIONS where Q_difficulty='hard' AND Q_subject='SCIENCE' order by NEWID(); 
INSERT INTO #tmp 
select top 5 from QUESTIONS where Q_difficulty='hard' AND Q_subject='LANGUAGE' order by NEWID(); 
INSERT INTO #tmp 
select top 5 from QUESTIONS where Q_difficulty='hard' AND Q_subject='HISTORY' order by NEWID(); 
SELECT * FROM #tmp 
+0

нет другого пути? :( – user1625766

+0

«Приходится» так ... inflexib ле. :) – ErikE

+0

Ну, только что узнал что-то новое. Спасибо, что ознакомили нас с некоторыми функциями MSSQL 2008: VALUES - хороший, и, конечно же, CROSS APPLY of MSSQL 2005. ;-) – cars10m

Смежные вопросы