Reputation: 1171
I have two tables,
Students
-------------
STUDENT_ID INT
CLASS_ID INT
Records
-----------
RECORD_ID INT
STUDENT_ID INT
CLASS_ID INT
TEST_SCORE INT
TEST_DATE DATE
TEST_SEQUENCE INT
And I want to get the result like the latest test score for each students in a specific class and a specific year.
For example, I want to get 2014's student test scores where CLASS_ID = 5. If there is more than two test scores for one student in the same date(TEST_DATE), I want to get the data which has highest TEST_SEQUENCE number.
I did it something like this:
SELECT s.* FROM STUDENTS s
INNER JOIN (SELECT STUDENT_ID, MAX(TEST_DATE) as Latest
FROM Records GROUP BY STUDENT_ID) r
ON s.STUDENT_ID = r.STUDENT_ID AND s.TEST_DATE = r.Latest
So I can get the latest TEST_SCORE for each students.
But I don't know how to get the data if there are several records in the same TEST_DATE.
Upvotes: 0
Views: 65
Reputation: 70648
;WITH CTE AS
(
SELECT *,
RN = ROW_NUMBER() OVER( PARTITION BY STUDENT_ID
ORDER BY TEST_DATE DESC, TEST_SEQUENCE DESC)
FROM dbo.Records
WHERE CLASS_ID = 5
AND TEST_DATE >= '20140101'
)
SELECT S.*
FROM dbo.Students S
INNER JOIN CTE R
ON S.STUDENT_ID = R.STUDENT_ID
WHERE R.RN = 1
Upvotes: 1