Выбор последней попытки теста от студентов - PullRequest
0 голосов
/ 08 ноября 2010

У меня есть таблица с информацией от студентов и тестов, каждый раз, когда студент сдает тест, в этой таблице сохраняется запись, поэтому я хочу получить последнюю попытку от студентов одного теста.

| IdStudent | IdTest | Attempt|
-------------------------------
| 1         | 1      | 1      |
-------------------------------
| 2         | 1      | 1      |
-------------------------------
| 1         | 1      | 2      |
-------------------------------
| 2         | 2      | 1      |

Допустим, если я выберу номер теста 1, я хочу получить записи 2 и 3, если я выберу тест 2, я хочу получить запись 4 и т. Д.

Надеюсь, вопросясно.Заранее спасибо за помощь.

Ответы [ 4 ]

2 голосов
/ 08 ноября 2010

@ Ответ Джеффа даст вам цифры, но не ряды.Если вам нужны другие данные в строке, вы должны использовать подзапрос или CTE.Как то так:

WITH JeffAnswer AS
(
  SELECT IdStudent, IdTest, MAX(Attempt) AS MaxAttept
  FROM StudentTable
  WHERE IdTest = @TestNumber
  GROUP BY IdStudent, IdTest
)
SELECT * 
FROM StudentTable S
INNER JOIN JeffAnswer J ON
   S.IdStudent = J.IdStudent AND 
   S.IdTest = J.IdTest AND 
   S.Attempt = J.MaxAttempt
2 голосов
/ 08 ноября 2010

Следующий SQL даст вам то, что вы хотите:

SELECT IdStudent, IdTest, MAX(Attempt)
FROM StudentTable
WHERE IdTest = @TestNumber
GROUP BY IdStudent, IdTest
0 голосов
/ 09 ноября 2010

Мне нравится использовать RowNumber () в подобных случаях, потому что позже критерии легко изменить и часто быстрее, чем с помощью GROUP BY.

SELECT IdStudent, IdTest, Attempt  
  FROM (
          SELECT IdStudent, IdTest, Attempt, RowId = ROW_NUMBER() OVER(PARTITION BY IdStudent, IdTest ORDER BY IdStudent, IdTest, Attempt Desc)  
            FROM Student  
           WHERE IdTest = @IdTest
       ) tt  
 WHERE tt.RowId = 1 
0 голосов
/ 08 ноября 2010

Некоторые альтернативные подходы Джеффа Хорнби:

Select ...
From Table As T1
Where Exists    (
                Select 1
                From Table As T2
                Where T2.IdStudent = T1.IdStudent
                    And T2.IdTest =T1.IdTest
                Having Max(T2.Attempt) = T1.Attempt
                )

Если вы используете SQL Server 2005 +:

With RankedTests As
    (
    Select IdStudent, IdTest, Attempt, ...
        , Row_Number() Over ( Partition By IdStudent, IdTest
                                 Order By Attempt Desc ) As Num
    From Table
    )
Select ...
From RankedTests
Where Num = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...