KEEP(DENSE_RANK LAST)とGROUP BYを使う方法か、またはROW_NUMBER()で順番を付けた副問合せと結合して1番目だけ抽出する方法はいかがでしょうか。
SELECT項目が多い場合は、後者の方法の方が使い勝手が良いですが、「JOINの結果に対して絞込はしたい」という制約があると(いじれないビューになってるとかで)、前者の方法でしょうか。
KEEP(DENSE_RANK LAST)はORDER BY(年度と期の昇順)でソートした最後の行(つまり年度と期が最大の行)に対してMAX()をとっています。ORDER BYでソート順が一意に決まるならMAX()でもMIN()でも結果は同じです。
SQL
1SELECT r.syain_id AS "社員コード",
2 s.syain_name AS "社員名",
3 MAX(r.nendo) KEEP (DENSE_RANK LAST
4 ORDER BY r.nendo, r.ki) AS "年度",
5 MAX(r.ki) KEEP (DENSE_RANK LAST
6 ORDER BY r.nendo, r.ki) AS "期"
7FROM rireki r
8INNER JOIN syain s
9ON s.syain_id = r.syain_id
10GROUP BY r.syain_id,
11 s.syain_name
12ORDER BY r.syain_id
SQL
1WITH
2 sorted_rireki AS (
3 SELECT r.syain_id,
4 r.nendo,
5 r.ki,
6 ROW_NUMBER() OVER(PARTITION BY r.syain_id
7 ORDER BY r.nendo DESC, r.ki DESC) AS row_num
8 FROM rireki r
9 )
10SELECT sr.syain_id AS "社員コード",
11 s.syain_name AS "社員名",
12 sr.nendo AS "年度",
13 sr.ki AS "期"
14FROM sorted_rireki sr
15INNER JOIN syain s
16ON s.syain_id = sr.syain_id
17WHERE sr.row_num = 1
18ORDER BY sr.syain_id