El enfoque de logaritmo/potencia es el enfoque generalmente utilizado. Para Oracle, eso es:
select exp(sum(ln(col)))
from table;
No sé por qué los diseñadores de la base de datos original no incluyeron PRODUCT()
como una función de agregación. Mi mejor conjetura es que todos eran informáticos, sin estadísticos. Tales funciones son muy útiles en estadística, pero no aparecen mucho en informática. Tal vez no querían lidiar con los problemas de desbordamiento que tal función implicaría (especialmente en números enteros).
Por cierto, esta función no se encuentra en la mayoría de las bases de datos, incluso en aquellas que implementan muchas funciones de agregación estadística.
editar:
Oy, el problema de los números negativos lo hace un poco más complicado:
select ((case when mod(sum(sign(col)), 2) = 0 then 1 else -1 end) *
exp(sum(ln(abs(col))))
) as product
No estoy seguro de una forma segura en Oracle para manejar 0
s. Este es un enfoque "lógico":
select (case when sum(case when col = 0 then 1 else 0 end) > 0
then NULL
when mod(sum(sign(col)), 2) = 0
then exp(sum(ln(abs(col)))
else - exp(sum(ln(abs(col)))
end)
) as product
El problema es que el motor de la base de datos puede obtener un error en el registro antes de ejecutar el case
declaración. Así es como funciona SQL Server. No estoy seguro acerca de Oracle.
Ah, esto podría funcionar:
select (case when sum(case when col = 0 then 1 else 0 end) > 0
then NULL
when mod(sum(sign(col)), 2) = 0
then exp(sum(ln(case when col <> 0 then abs(col) end)))
else - exp(sum(ln(case when col <> 0 then abs(col) end)))
end)
) as product
Devuelve NULL
cuando hay un 0
.