Какой самый эффективный способ в T-SQL сравнить строки ответов с ключами ответов для оценки результатов экзамена? - PullRequest
0 голосов
/ 15 октября 2010

Эти экзамены, как правило, имеют около 120 вопросов. В настоящее время их строки сравниваются с ключами и им присваивается значение 1 или 0. Когда закончите, подсчитайте 1 для общего счета.

Существуют ли какие-либо функции T-SQL, такие как пересечение или различие, или что-то другое, что бы как можно быстрее обрабатывать этот процесс для 100 000 испытуемых?

Заранее благодарим за Ваш опыт.

-Steven

Ответы [ 2 ]

0 голосов
/ 16 августа 2011

Нечто подобное может сработать для вас:

select student_id, studentname, answers, 0 as score
    into #scores from test_answers
declare @studentid int
declare @i int
declare @answers varchar(120)
declare @testkey varchar(120)
select @testkey = test_key from test_keys where test_id = 1234
declare student_cursor cursor for
    select student_id from #scores
open student_cursor
fetch next from student_cursor into @studentid
while @@FETCH_STATUS = 0
begin
    select @i = 1
    select @answers = answers from #scores where student_id = @studentid
    while @i < len(@answers)
    begin
        if mid(@answers, @i, 1) = mid(@testkey, @i, 1)
            update #scores set score = score + 1 where student_id = @studentid
        select @i = @i + 1
    end
    fetch next from student_cursor into @studentid
end
select * from #scores
drop table #scores

Я сомневаюсь, что это самый эффективный способ сделать это, но, по крайней мере, это неплохая отправная точка.

0 голосов
/ 15 октября 2010

Попробуйте выбрать равенство вопроса правильному ответу. Я предполагаю, что у вас есть тесты студента в одной таблице и ключ в другой; что-то вроде этого должно работать:

select student_test.student_id, 
   student_test.test_id, 
   student_test.question_id, 
   (student_test.answer == test_key.answer OR (student_test.answer IS NULL AND test_key.answer IS NULL))
from student_test
INNER JOIN test_key
   ON student_test.test_id = test_key.test_id
      AND student_test.question_id = test_key.question_id
WHERE student_test.test_id = <the test to grade>

Вы можете сгруппировать результаты по ученикам и тестам, а затем суммировать последний столбец, если хотите, чтобы БД дала вам общий балл. Это даст подробный «правильный / неправильный» анализ теста.

РЕДАКТИРОВАТЬ: ответы хранятся в виде непрерывной строки, что делает его намного сложнее. Скорее всего, вам придется реализовать это процедурным способом с помощью курсора, то есть ответы каждого учащегося загружаются, помещаются в varchar (1) и сравниваются с ключом в режиме RBAR (строка с агонизирующей строкой). Вы также можете реализовать скалярную функцию, которая сравнивает строку A со строкой B по одному символу за раз и возвращает количество различий, а затем вызывает эту функцию из основного запроса, который будет вызывать эту функцию для каждого учащегося.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...