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
.