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
.