И вот еще один способ сделать это с аналитическими функциями:
WITh test_data AS
(
SELECT 1 StudentID, 2009 Cohort, 'Spring' Term, 2011 DegreeYear, '05' DegreeMonth FROM dual
UNION ALL
SELECT 1, 2009, 'Spring', 2013, '10' FROM dual
UNION ALL
SELECT 2, 2012, 'Fall' , 2015, '05' FROM dual
UNION ALL
SELECT 3, 2015, 'Fall' , 2017, '05' FROM dual
UNION ALL
SELECT 3, 2015, 'Fall' , 2018, '05' FROM dual
)
SELECT * FROM
(
SELECT ROW_NUMBER() OVER (PARTITION BY Cohort ORDER BY Cohort, DegreeYear, DegreeMonth) rno
, StudentID, Cohort, Term, DegreeYear, DegreeMonth
, LEAD(DegreeYear) OVER (PARTITION BY Cohort ORDER BY Cohort, DegreeYear, DegreeMonth) DegreeYear2
, LEAD(DegreeMonth) OVER (PARTITION BY Cohort ORDER BY Cohort, DegreeYear, DegreeMonth) DegreeMonth2
FROM test_data
)
WHERE rno = 1
ORDER BY Cohort, DegreeYear, DegreeMonth
/
Вывод:
RNO STUDENTID COHORT TERM DEGREEYEAR DEGREEMONTH DEGREEYEAR2 DEGREEMONTH2
1 1 2009 Spring 2011 05 2013 10
1 2 2012 Fall 2015 05
1 3 2015 Fall 2017 05 2018 05