Theo MUL, bạn có nghĩa là nhân lũy tiến các giá trị?
Ngay cả với 100 hàng có kích thước nhỏ (giả sử 10 giây), MUL (cột) của bạn sẽ làm tràn bất kỳ kiểu dữ liệu nào! Với khả năng sử dụng sai / ab cao như vậy và phạm vi sử dụng rất hạn chế, nó không cần phải là Chuẩn SQL. Như những người khác đã chỉ ra rằng có những cách toán học để giải quyết nó, cũng như có nhiều cách để thực hiện các phép tính phức tạp trong SQL chỉ bằng cách sử dụng các phương pháp tiêu chuẩn (và thông dụng).
Dữ liệu mẫu:
Column
1
2
4
8
COUNT : 4 items (1 for each non-null)
SUM : 1 + 2 + 4 + 8 = 15
AVG : 3.75 (SUM/COUNT)
MUL : 1 x 2 x 4 x 8 ? ( =64 )
Để hoàn thiện, triển khai lõi Oracle, MSSQL, MySQL *
Oracle : EXP(SUM(LN(column))) or POWER(N,SUM(LOG(column, N)))
MSSQL : EXP(SUM(LOG(column))) or POWER(N,SUM(LOG(column)/LOG(N)))
MySQL : EXP(SUM(LOG(column))) or POW(N,SUM(LOG(N,column)))
- Cẩn thận khi sử dụng EXP / LOG trong SQL Server, hãy xem loại trả về http://msdn.microsoft.com/en-us/library/ms187592.aspx
- Dạng POWER cho phép các số lớn hơn (sử dụng cơ số lớn hơn số Euler) và trong trường hợp kết quả tăng quá lớn để quay lại bằng POWER, bạn có thể chỉ trả về giá trị logarit và tính số thực bên ngoài Truy vấn SQL
* LOG (0) và LOG (-ve) là không xác định. Dưới đây chỉ trình bày cách xử lý điều này trong SQL Server. Tương đương có thể được tìm thấy cho các phiên bản SQL khác, sử dụng cùng một khái niệm
create table MUL(data int)
insert MUL select 1 yourColumn union all
select 2 union all
select 4 union all
select 8 union all
select -2 union all
select 0
select CASE WHEN MIN(abs(data)) = 0 then 0 ELSE
EXP(SUM(Log(abs(nullif(data,0))))) -- the base mathematics
* round(0.5-count(nullif(sign(sign(data)+0.5),1))%2,0) -- pairs up negatives
END
from MUL
Thành phần:
- lấy abs () của dữ liệu, nếu min là 0, nhân với bất kỳ thứ gì khác là vô ích, kết quả là 0
- Khi dữ liệu bằng 0, NULLIF chuyển đổi nó thành null. Cả abs (), log () đều trả về null, khiến nó bị loại trừ khỏi sum ()
- Nếu dữ liệu không phải là 0, abs cho phép chúng tôi nhân một số âm bằng phương pháp LOG - chúng tôi sẽ theo dõi số âm ở những nơi khác
- Tìm ra dấu hiệu cuối cùng
- dấu (dữ liệu) trả về
1 for >0
,0 for 0
và-1 for <0
. - Chúng tôi thêm 0,5 nữa và lấy lại dấu (), vì vậy giờ đây chúng tôi đã phân loại cả 0 và 1 là 1 và chỉ -1 là -1.
- lại sử dụng NULLIF để xóa khỏi COUNT () số 1, vì chúng tôi chỉ cần đếm các phủ định.
-
% 2
chống lại số lượng () số âm trả về một trong hai số đó - -> 1 nếu có một số lẻ là số âm
- -> 0 nếu có một số chẵn là số âm
- nhiều thủ thuật toán học hơn:chúng tôi lấy 1 hoặc 0 giảm 0,5, để ở trên trở thành
- -> (
0.5-1=-0.5
=> làm tròn thành -1 ) nếu có một số lẻ các số âm - -> (
0.5-0= 0.5
=> làm tròn thành 1 ) nếu có một số chẵn là số âm - chúng tôi nhân 1 / -1 cuối cùng này với giá trị SUM-PRODUCT để có kết quả thực
- dấu (dữ liệu) trả về