sql >> Databáze >  >> RDS >> Oracle

Agregační funkce Product().

Obecně používaný přístup je logaratmus/výkon. Pro Oracle to je:

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

Nevím, proč původní návrháři databází nezahrnuli PRODUCT() jako agregační funkce. Můj nejlepší odhad je, že všichni byli počítačoví vědci, bez statistiků. Takové funkce jsou velmi užitečné ve statistice, ale v informatice se příliš neprojevují. Možná se nechtěli zabývat problémy s přetečením, které by taková funkce implikovala (zejména na celá čísla).

Mimochodem, tato funkce chybí ve většině databází, dokonce i v těch, které implementují spoustu funkcí statistické agregace.

upravit:

Jo, problém záporných čísel to trochu komplikuje:

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

Nejsem si jistý bezpečným způsobem, jak v Oracle zpracovat 0 s. Toto je „logický“ přístup:

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

Problém je v tom, že databázový stroj může před provedením case získat chybu v protokolu tvrzení. Takhle funguje SQL Server. Nejsem si jistý u Oracle.

Aha, to by mohlo fungovat:

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

Vrací NULL když je tam 0 .



  1. Jaké jsou osvědčené postupy pro samoaktualizaci aplikací PHP+MySQL?

  2. Jak udělat MySQL + podřetězec? + vyměnit?

  3. MySQL:Přístup odepřen uživateli 'test'@'localhost' (pomocí hesla:ANO) kromě uživatele root

  4. ASP/.NET připojit MySQL Server bez použití ODBC nebo jakéhokoli ovladače?