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。如果这是一个问题,那么使用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 回答
22

使用GREATEST但也处理可能NULL

SELECT name, GREATEST(NVL(m1,0), NVL(m2,0), NVL(m3,0), NVL(m4,0)) AS "Max"
FROM yourtable

输入:

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

SQL小提琴:http ://sqlfiddle.com/#!4/ae268/7/0

输入:

name m1 m2   m3 m4
A    1  2    3  null
B    6  null 4  5
C    1  5    2  1

输出:

NAME Max
A    3
B    6
C    5

SQL小提琴:http ://sqlfiddle.com/#!4/b1c46/1/0

于 2015-06-17T07:41:44.187 回答