Oracle
 sql >> база данни >  >> RDS >> Oracle

Product() агрегатна функция

Подходът на логаратъм/степен е най-често използваният подход. За Oracle това е:

select exp(sum(ln(col)))
from table;

Не знам защо първоначалните дизайнери на бази данни не са включили PRODUCT() като агрегираща функция. Най-доброто ми предположение е, че всички те са били компютърни учени, без статистици. Такива функции са много полезни в статистиката, но не се показват много в компютърните науки. Може би не са искали да се справят с проблемите на препълването, които такава функция би предполагала (особено при цели числа).

Между другото, тази функция липсва в повечето бази данни, дори в тези, които прилагат много функции за статистическо агрегиране.

редактиране:

Проблемът с отрицателните числа го прави малко по-сложен:

select ((case when mod(sum(sign(col)), 2) = 0 then 1 else -1 end) *
        exp(sum(ln(abs(col))))
       ) as product

Не съм сигурен за безопасен начин в Oracle за обработка на 0 с. Това е "логичен" подход:

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

Проблемът е, че машината на базата данни може да получи грешка в регистрационния файл, преди да изпълни case изявление. Така работи SQL Server. Не съм сигурен за Oracle.

А, това може да свърши работа:

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

Връща NULL когато има 0 .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP7.0-FPM с Docker:Не може да се зареди динамична библиотека OCI8

  2. DML и обработка на изключения - Oracle

  3. Oracle:Разделете текстовото поле на нов ред

  4. Разделен със запетаи низ за списък

  5. Вземете името на извикващата процедура или функция в Oracle PL/SQL