Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Produk() fungsi agregat

Pendekatan logaratma/kekuatan adalah pendekatan yang umum digunakan. Untuk Oracle, yaitu:

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

Saya tidak tahu mengapa perancang basis data asli tidak menyertakan PRODUCT() sebagai fungsi agregasi. Tebakan terbaik saya adalah mereka semua adalah ilmuwan komputer, tanpa ahli statistik. Fungsi seperti itu sangat berguna dalam statistik, tetapi tidak banyak muncul dalam ilmu komputer. Mungkin mereka tidak ingin berurusan dengan masalah overflow, yang akan disiratkan oleh fungsi seperti itu (terutama pada bilangan bulat).

Omong-omong, fungsi ini tidak ada di sebagian besar database, bahkan yang mengimplementasikan banyak fungsi agregasi statistik.

edit:

Oy, soal bilangan negatif membuatnya sedikit lebih rumit:

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

Saya tidak yakin dengan cara yang aman di Oracle untuk menangani 0 s. Ini adalah pendekatan "logis":

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

Masalahnya adalah mesin database mungkin mendapatkan kesalahan pada log sebelum menjalankan case penyataan. Itu kebetulan cara kerja SQL Server. Saya tidak yakin tentang Oracle.

Ah, ini mungkin berhasil:

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

Ini mengembalikan NULL ketika ada 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. Pisahkan kolom menjadi beberapa baris

  2. Kelas OracleBulkCopy di Oracle.ManagedDataAccess.dll?

  3. Waktu habis dari OracleDataAdapter.Fill()

  4. Oracle:Permintaan SQL untuk menemukan semua pemicu milik tabel?

  5. Tomcat 6/7 JNDI dengan banyak sumber data