我必须比较每行的三个COLUMNS并从这些列中获取MAX数据。我的样本数据是:
create table sept18 ( t1 number, t2 number, t3 number );
insert all
into sept18 values (1,2,3)
into sept18 values (-1,-2,3)
into sept18 values (1,null,13)
into sept18 values (-1,-2,-3)
into sept18 values (-1,0,0)
select * from dual;
我的操作应该显示三列和每行中具有最大值的字段。例如,对于第一行和第二行,它是3,第三行是13,第四行是-1,第五行是0。
我怎样才能做到这一点?我必须使用分区吗?
答案 0 :(得分:3)
不,您不必使用分析查询(我假设您的分区是什么意思?)。分析函数用于计算某些描述的总量。你不打算在列中聚合任何东西;你想在行中找到最大值。
为此,您需要使用greatest()
功能,与least()
相反。
select a.*, greatest(t1, t2, t3)
from sept18 a
警告;如果单个列为null,则这两个函数都将返回null。你如何处理这个问题是你的决定。我的正常策略是使用nvl()
具有完全荒谬的价值。这可能很危险,因为您选择的“荒谬”值可能会变得正确,因此请确保您了解数据。
select a.*, greatest(nvl(t1,-9999), nvl(t2, -9999), nvl(t3, -9999))
from sept18 a
这里有一点SQL Fiddle来演示这两个查询。
如果所有列都为null,那么你可以进一步下降到荒谬。您必须nullif()
greatest()
,或者更简单地说,只需使用WHERE来排除所有列都为空的行。
一点额外的观点。表sept18
的存在似乎有点可疑。如果您实际上每天有一个表,那么您应该考虑规范化数据库并创建一个temporal table,其中created_date
列。