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を安全に処理する方法がわかりません。 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がある場合 。



    1. MySQLデータベースの文字セットと照合全体をUTF-8に変換するにはどうすればよいですか?

    2. MySQLデータとハッシュ化されたパスワードを使用したPHPログイン

    3. PHPエラーの取得警告:fputcsv()はパラメーター2が配列であることを期待しています

    4. mysqlの(sum、max、avg)コンマ区切り列を計算します