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以外の値に変換する必要があります。