从每行中选择最大值

时间:2012-09-18 06:55:46

标签: sql oracle oracle10g

我必须比较每行的三个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。

我怎样才能做到这一点?我必须使用分区吗?

1 个答案:

答案 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列。