sql >> Base de Datos >  >> RDS >> Oracle

Producto () función agregada

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 .