整个问题几乎都在标题中。对于表的每一行,我想选择列子集的最大值。
例如,从这个表
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。如果这是一个问题,那么使用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>
使用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