質問全体はほとんどタイトルにあります。テーブルの各行について、列のサブセットの最大値を選択したいと思います。
たとえば、この表から
name m1 m2 m3 m4
A 1 2 3 4
B 6 3 4 5
C 1 5 2 1
結果は
name max
A 4
B 6
C 5
クエリは、Oracle 8i と互換性がある必要があります。
このテストデータを考えると...
SQL> select *
2 from your_table
3 /
NAME M1 M2 M3 M4
---- ---------- ---------- ---------- ----------
A 1 2 3 4
B 6 3 4 5
C 1 5 2 1
SQL>
... 簡単な GREATEST() 呼び出しで、目的の結果が得られます。
SQL> select name
2 , greatest(m1, m2, m3, m4) as the greatest_m
3 from your_table
4 /
NAME THE_GREATEST_M
---- --------------
A 4
B 6
C 5
SQL>
greatest()
引数のいずれかが null の場合、NULL が返されることに注意してください。これが問題になる場合は、 を使用nvl()
して、結果を歪めないデフォルト値を指定してください。たとえば、負になる値がない場合....
SQL> select name
2 , greatest(nvl(m1,0), nvl(m2,0), nvl(m3,0), nvl(m4,0)) as the greatest_m
3 from your_table
4 /
NAME THE_GREATEST_M
---- --------------
A 4
B 6
C 5
SQL>