2010-11-08 62 views
0

我有一張來自學生和考試信息的表格,每次學生參加考試時都會在此表中保存一條記錄,所以我想從一個考試的學生那裏得到最後一次嘗試。從學生中選擇考試的最後一次嘗試

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

比方說,如果我選擇測試號1我想要得到的記錄是2和3,如果我選擇測試2我想要得到的戰績是4等

希望問題很明顯。 在此先感謝您的幫助。

回答

2

下面的SQL會得到你想要的東西:

SELECT IdStudent, IdTest, MAX(Attempt) 
FROM StudentTable 
WHERE IdTest = @TestNumber 
GROUP BY IdStudent, IdTest 
+0

+1 Jeff你可能會考慮在MAX上添加一個別名(嘗試) – 2010-11-08 20:25:19

+0

@Conrad:好點。我也沒有使用CTE或自我加入,因爲表中沒有其他數據表示Argons給我們,也沒有告訴我們有任何其他數據 – 2010-11-08 20:29:05

+0

是真實的......但他確實說「記錄」意味着「行」。誰知道? – Hogan 2010-11-08 20:31:00

2

@傑夫的回答將讓你的電話號碼,但沒有行。如果您需要行中的其他數據,則必須使用子查詢或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 
0

一些替代的方法來傑夫·霍恩比的:

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 
0

我喜歡的情況下使用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 
相關問題