基于SQL中的两列获取最新数据

时间:2014-07-11 17:04:25

标签: sql sql-server join

我有两张桌子,

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

我想得到的结果就像特定班级和特定年份的每个学生的最新考试成绩一样。

例如,我希望获得2014年CLASS_ID = 5的学生考试成绩。 如果一个学生在同一天(TEST_DATE)有两个以上的考试成绩,我想得到TEST_SEQUENCE数最高的数据。

我这样做了:

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

所以我可以为每个学生获得最新的TEST_SCORE。

但如果在同一个TEST_DATE中有多条记录,我就不知道如何获取数据。

1 个答案:

答案 0 :(得分:1)

;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