Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Hàm tổng hợp sản phẩm ()

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 .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để kiểm tra xem giá trị DataReader không phải là null hay không?

  2. Giới thiệu về cách tạo trong Oracle Express - SQL. Trình kích hoạt để cập nhật một cột

  3. Tôi gặp lỗi ORA-01775:lặp lại chuỗi từ đồng nghĩa khi tôi sử dụng sqlldr

  4. Cách sử dụng LISTAGG để trả về các hàng có tiền tố là dấu ngoặc kép

  5. Làm thế nào để chèn một giá trị vào một bảng lồng nhau mà không làm mất dữ liệu trong bảng đó?