这看起来像是一个经典的 top-n-per-group 问题。
一种方法是使用ROW_NUMBER 函数。
样本数据
CREATE TABLE TEMP1(ROWNUM INT,
NAME VARCHAR(50), COURSE VARCHAR(50), year int,
CAT VARCHAR(50), HRSCODE VARCHAR(30), GRADE VARCHAR(10))
insert TEMP1 values
('1' , 'STUDENT1' , 'MATH ' , 2016,'CRS1' ,'MT1.Y7' , 'A+'),
('1' , 'STUDENT1' , 'ENGLISH ' , 2016,'CRS2' ,'ENG14.JI', 'B'),
('1' , 'STUDENT1' , 'SCIENCE ' , 2016,'CRS3' ,'SCI678' , 'C'),
('1' , 'STUDENT1' , 'HISTORY ' , 2016,'CRS4' ,'HIS704' , 'A+'),
('2' , 'STUDENT1' , 'MATH ' , 2016,'CRS1' ,'MT1.Y7' , 'A-'),
('2' , 'STUDENT1' , 'ENGLISH ' , 2016,'CRS2' ,'ENG14.JI', 'B+'),
('2' , 'STUDENT1' , 'SCIENCE ' , 2016,'CRS3' ,'SCI678' , 'C+'),
('2' , 'STUDENT1' , 'HISTORY ' , 2016,'CRS4' ,'HIS704' , 'C-'),
('3' , 'STUDENT1' , 'MATH ' , 2017,'CRS1' ,'MT1.Y7' , 'A+'),
('3' , 'STUDENT1' , 'ENGLISH ' , 2017,'CRS2' ,'ENG14.JI', 'A+'),
('3' , 'STUDENT1' , 'PSYCHOLOGY ' , 2017,'CRS3' ,'PSY9.78' , 'B'),
('3' , 'STUDENT1' , 'PHYSICS ' , 2017,'CRS4' ,'PHY53.XG', 'B'),
('4' , 'STUDENT1' , 'MATH ' , 2017,'CRS1' ,'MT1.Y7' , 'A'),
('4' , 'STUDENT1' , 'ENGLISH ' , 2017,'CRS2' ,'ENG14.JI', 'C'),
('4' , 'STUDENT1' , 'PSYCHOLOGY ' , 2017,'CRS3' ,'PSY9.78' , 'B'),
('4' , 'STUDENT1' , 'PHYSICS ' , 2017,'CRS4' ,'PHY53.XG', 'C+');
请注意,您在 rextester 中的原始样本数据在课程名称中有标签,我将其替换为空格。
查询
SELECT TOP(1) WITH TIES
NAME
,COURSE
,year
,CAT
,HRSCODE
,GRADE
FROM TEMP1
ORDER BY ROW_NUMBER() OVER (PARTITION BY NAME, COURSE ORDER BY year DESC, ROWNUM DESC)
;
http://rextester.com/edit/KQKP45357
结果
+----+----------+-------------+------+------+----------+-------+
| | NAME | COURSE | year | CAT | HRSCODE | GRADE |
+----+----------+-------------+------+------+----------+-------+
| 1 | STUDENT1 | ENGLISH | 2017 | CRS2 | ENG14.JI | C |
| 2 | STUDENT1 | MATH | 2017 | CRS1 | MT1.Y7 | A |
| 3 | STUDENT1 | HISTORY | 2016 | CRS4 | HIS704 | C- |
| 4 | STUDENT1 | PHYSICS | 2017 | CRS4 | PHY53.XG | C+ |
| 5 | STUDENT1 | PSYCHOLOGY | 2017 | CRS3 | PSY9.78 | B |
| 6 | STUDENT1 | SCIENCE | 2016 | CRS3 | SCI678 | C+ |
+----+----------+-------------+------+------+----------+-------+
这个查询的更常见的写法是这样的:
WITH
CTE
AS
(
SELECT
ROWNUM
,NAME
,COURSE
,year
,CAT
,HRSCODE
,GRADE
,ROW_NUMBER() OVER(PARTITION BY NAME, COURSE ORDER BY year DESC, ROWNUM DESC) AS rn
FROM TEMP1
)
SELECT
NAME
,COURSE
,year
,CAT
,HRSCODE
,GRADE
FROM CTE
WHERE rn = 1
ORDER BY NAME, COURSE
;