対数/パワーアプローチは、一般的に使用されるアプローチです。 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
を安全に処理する方法がわかりません。 s。これは「論理的な」アプローチです:
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
を実行する前にデータベースエンジンがログでエラーを取得する可能性があることです。 声明。それがSQLServerの仕組みです。 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
がある場合 。