修正後のSQLと解説
相関サブクエリを使用
select ID,Val,extraCol
from getMaxRows a
where Val = (select max(b.Val)
from getMaxRows b
where b.ID = a.ID)
order by ID,extraCol;
大本のselect文のfrom句に指定されたテーブルが2個から1個に減りました。大本のselect文のfrom句のテーブルが1つになったことにより、表別名のaやbでの列修飾がほとんど不要になり、可読性が向上しました。
また、「IDごとにValが最大値の行を出力する」という日本語の表現に近いSQLになりましたので、可読性が向上しました。
分析関数を使用
分析関数のmax関数を使ってIDごとのValの最大値を求めてから、where句で条件として使うのも、可読性の高いSQLだと思います。
select ID,Val,extraCol
from (select ID,Val,extraCol,
max(Val) over(partition by ID) as maxVal
from getMaxRows)
where Val = maxVal
order by ID,extraCol;
上記のSQLのイメージは下記です。分析関数のmax関数に対応する黄緑線と、partition by IDに対応する赤線を引いてます。

