根据此数据(假设行数事先未知):
with q1 as (select mod(ora_hash(level),5) c1 from dual connect by level <=4)
select * from q1;
/*
C1
--
2
1
4
1
*/
我想要所有行中 c1 列的乘积。类似于 SUM(c1) 的结果,我只希望每个值乘以其他值而不是相加。在这种情况下,这将是 2 * 1 * 4 * 1 = 8。
/*
X1
--
8
*/
数据可以包含负数和零,可以使用以下方法模拟:
with q1 as (select mod(ora_hash(level),5)-1 c1 from dual connect by level <=4)
select * from q1;
或者
with q1 as (select mod(ora_hash(level),5)-3 c1 from dual connect by level <=4)
select * from q1;
我知道这可以通过自定义聚合函数来完成,但我对本机方法很感兴趣。
对于足够小的聚合产品,您可以使用对数求和并将结果取幂的老技巧
由于您使用的是 11.2,它有点冗长(尽管有人可能会想出一个更简单的版本),但您也可以使用递归公用表表达式
贾斯汀启发我尝试使用该
MODEL
子句的版本。这是我第一次使用该条款,所以我愿意接受任何建设性的批评。我创建了三个 CTE 来测试负数和零。这是处理负值和零值的日志解决方案的充实版本。
最后,这是一个类似于 Justins 的递归 CTE,但稍微简单一些。