0

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

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

4

1 回答 1

3

不,您不必使用分析查询(我假设这就是分区的意思?)。分析函数用于计算某种描述的总量。您不希望跨列聚合任何内容;你想连续找到最大值。

为此,您需要使用greatest()least().

select a.*, greatest(t1, t2, t3)
  from sept18 a

被警告; 如果单列为空,这两个函数都将返回空。你如何处理这是你的决定。我的正常策略是使用nvl()完全荒谬的值。这可能很危险,因为您选择的“荒谬”值可能会变得正确,因此请确保您了解您的数据。

select a.*, greatest(nvl(t1,-9999), nvl(t2, -9999), nvl(t3, -9999))
  from sept18 a

这是一个小SQL Fiddle来演示这两个查询。

如果所有列都为空,那么您甚至可以进一步陷入荒谬。您必须nullif()使用greatest(),或者更简单地说,只需使用 WHERE 来排除所有列都为空的行。

一点额外的点。表的存在sept18似乎有点可疑。如果您实际上每天有一个表,那么您应该考虑规范化您的数据库并创建例如一个包含一列的临时表。created_date

于 2012-09-18T21:01:31.447 回答