Oracle 複数列の中で値が最大(最小)の値を取得する方法
集計関数のMAX
やMIN
では取得した行の中の最大(最小)の値を取得しますが、取得した行ごとに複数の列の中で最大(最小)の値を取得する方法を紹介します。
例えば以下のテーブルがあるとします。(生徒ごとにテストの成績を格納しているとします。)
id | japanese | english | math |
---|---|---|---|
1 | 67 | 43 | 61 |
2 | 36 | 66 | 82 |
3 | 76 | 77 | 51 |
4 | 83 | 56 | 86 |
このとき、生徒全体の国語(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
id | highest | lowest |
---|---|---|
1 | 67 | 43 |
2 | 82 | 36 |
3 | 76 | 51 |
4 | 86 | 56 |
GREATEST(列1, 列2, 列3 ...)
のように指定すると、指定した列の値の中の最大値を取得します。
また、同じようにLEAST(列1, 列2, 列3 ...)
と指定すると、指定した列の値の中の最小値を取得します。
nullの扱い
値の中に1つでもnull
の値があると、結果は常にnull
となってしまいます。(GREATEST
、LEAST
の両方とも)
null
が想定される列を扱う場合はNVL
などでnull
以外の値に変換する必要があります。