37

質問全体はほとんどタイトルにあります。テーブルの各行について、列のサブセットの最大値を選択したいと思います。

たとえば、この表から

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 と互換性がある必要があります。

4

2 に答える 2

91

このテストデータを考えると...

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>
于 2010-05-28T10:21:06.493 に答える