如何使用像这样的Oracle GREATEST()函数?

时间:2018-08-13 14:10:34

标签: sql oracle oracle11g

例如,我有这个

select a.f1, b.f1, greatest(a.f2 - sum(b.f2)) as qty ...

那么,我该如何使用sum(b.f2)?如何通过字段sum()从表b中获得b.f2行并在表达式greatest(a.f2 - sum(b.f2))中求值?

    select t1.gid,
    greatest((t1.qty - sum(t2.qty) - t1.otherqty - t1.anotherqty), 0) as QTY,
  from bigtable t1
    inner join ambigioustable t2 on t2.gid = t1.gid
  group by 
    t1.gid,
    t1.qty,
    t1.otherqty, 
    t1.anotherqty,
      order by t1.gid;

我希望这个查询能对像这样的条目进行计算

---|gid|---|qty|--|label|---
     1       20    some item
     1       2     some item
     1       3     some item
     2       4     som another item
     ...

我对吗?

1 个答案:

答案 0 :(得分:1)

Oracle中的GREATEST函数主要是一个标量函数,这意味着它通常以单行作为输入标量值,并返回最大值。如果我正确阅读了您的问题,则希望找到与f2字段值之间的最大差异对应的一行。这需要对整个表/结果集进行计算。这样的事情应该起作用:

SELECT a_f1, b_f1, diff
FROM
(
    SELECT a.f1 AS a_f1, b.f1 AS b_f1, a.f2 - b.f1 AS diff,
        ROW_NUMBER() OVER (ORDER BY a.f2 - b.f2 DESC) AS rn
    FROM tableA a
    INNER JOIN tableB b
        ON a.id = b.id
) t
WHERE rn = 1;

注意:如果您不在乎差异的方向,则可以在对ORDER BY (ABS(a.f2 - b.f2))的调用中使用ROW_NUMBER