zukucode
主にWEB関連の情報を技術メモとして発信しています。

Oracle 複数列の中で値が最大(最小)の値を取得する方法

集計関数のMAXMINでは取得したの中の最大(最小)の値を取得しますが、取得した行ごとに複数の列の中で最大(最小)の値を取得する方法を紹介します。

例えば以下のテーブルがあるとします。(生徒ごとにテストの成績を格納しているとします。)

table1(成績)
idjapaneseenglishmath
1674361
2366682
3767751
4835686

このとき、生徒全体の国語(japanese)の最高点(MAX)や数学(math)の最低点(MIN)を取得するにはSQL GROUP BYで複数の行を集計して1行で取得するで紹介したように、GROUP BYを使って集計すればよいのですが、生徒ごとに最も良かった(悪かった)教科を取得するには、GREATESTまたはLEASTを使用します。

SELECT
  id,
  GREATEST(japanese, english, math) highest,
  LEAST(japanese, english, math) lowest
FROM table1
取得結果
idhighestlowest
16743
28236
37651
48656

GREATEST(列1, 列2, 列3 ...)のように指定すると、指定した列の値の中の最大値を取得します。

また、同じようにLEAST(列1, 列2, 列3 ...)と指定すると、指定した列の値の中の最小値を取得します。

nullの扱い

値の中に1つでもnullの値があると、結果は常にnullとなってしまいます。(GREATESTLEASTの両方とも)

nullが想定される列を扱う場合はNVLなどでnull以外の値に変換する必要があります。


関連記事