A partir desses dados (supondo que o número de linhas não seja conhecido antecipadamente):
with q1 as (select mod(ora_hash(level),5) c1 from dual connect by level <=4)
select * from q1;
/*
C1
--
2
1
4
1
*/
Eu quero o produto da coluna c1 de todas as linhas. Algo como os resultados de SUM(c1) apenas, quero cada valor multiplicado pelos outros, em vez de adicionados. Nesse caso, seria 2 * 1 * 4 * 1 = 8.
/*
X1
--
8
*/
Os dados podem conter números negativos e zero, que podem ser simulados usando:
with q1 as (select mod(ora_hash(level),5)-1 c1 from dual connect by level <=4)
select * from q1;
ou
with q1 as (select mod(ora_hash(level),5)-3 c1 from dual connect by level <=4)
select * from q1;
Sei que isso pode ser feito com função de agregação personalizada, mas estou interessado em abordagens nativas.
Para produtos agregados suficientemente pequenos, você pode usar o velho truque de somar os logaritmos e exponenciar o resultado
Como você está usando 11.2, é um pouco mais detalhado (embora alguém possa descobrir uma versão mais simples), mas você também pode usar expressões de tabela comuns recursivas
Justin me inspirou a tentar uma versão usando a
MODEL
cláusula. Este é meu primeiro uso da cláusula, então estou aberto a qualquer crítica construtiva. Criei três CTEs para testar números negativos e zero.Aqui está uma versão detalhada da solução de log que lida com valores negativos e zero.
Finalmente, aqui está um CTE recursivo semelhante ao Justins, mas um pouco mais simples.