(Предполагается, что SQL Server 2005 или более поздняя версия, или другая RDMBS, которая поддерживает CTE и оконные функции)
Что-то вроде:
;With OrderedScores as (
SELECT
ST_STUDENT_ID,
ST_TIMESTAMP,
SC_SCORE,
ROW_NUMBER() OVER (ORDER BY SC_SCORE desc,newid()) as rn /* Ordered randomly within same score */
FROM
STUDENTS
join
SCORES
on ST_STUDENT_ID = SC_STUDENT_ID
WHERE
ST_TIMESTAMP >= '20110101' and
ST_TIMESTAMP < '20110201'
)
select * from OrderedScores where rn = 1
Очевидно, что вы можете поиграть с критериями в пределах ORDER BY
оконной функции, чтобы определить, какого ученика вы выбираете при наличии связей (в приведенном выше примере это случайный случай; опять же, если предположить, что SQL Server - если другая СУБД, заменить на что-то другое)
Кроме того, я думаю, что у меня правильные критерии даты здесь - в исходном запросе у вас есть один набор критериев, который использует >
и <
(т.е. исключая Джима), а в другом вы используйте <=
и >=
, которые могут включать учащегося, прошедшего тестирование 1 февраля.