Cách tiếp cận logarathm / lũy thừa là cách tiếp cận thường được sử dụng. Đối với Oracle, đó là:
select exp(sum(ln(col)))
from table;
Tôi không biết tại sao các nhà thiết kế cơ sở dữ liệu ban đầu không bao gồm PRODUCT()
như một hàm tổng hợp. Dự đoán tốt nhất của tôi là tất cả họ đều là nhà khoa học máy tính, không có nhà thống kê. Các hàm như vậy rất hữu ích trong thống kê, nhưng chúng không xuất hiện nhiều trong khoa học máy tính. Có lẽ họ không muốn giải quyết các vấn đề tràn, mà hàm như vậy sẽ ngụ ý (đặc biệt là trên số nguyên).
Nhân tiện, chức năng này bị thiếu trong hầu hết các cơ sở dữ liệu, ngay cả những cơ sở dữ liệu triển khai nhiều chức năng tổng hợp thống kê.
chỉnh sửa:
Oy, vấn đề về số âm phức tạp hơn một chút:
select ((case when mod(sum(sign(col)), 2) = 0 then 1 else -1 end) *
exp(sum(ln(abs(col))))
) as product
Tôi không chắc về cách an toàn trong Oracle để xử lý 0
S. Đây là cách tiếp cận "hợp lý":
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
Vấn đề là công cụ cơ sở dữ liệu có thể gặp lỗi trên nhật ký trước khi thực thi case
bản tường trình. Đó là cách SQL Server hoạt động. Tôi không chắc về Oracle.
À, cách này có thể hoạt động:
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
Nó trả về NULL
khi có 0
.