我正在尝试创建一个计算数字表的统计标准化值的函数。我一直收到错误ORA-01476:除数等于零。救命!!!
CREATE FUNCTION NORMALIZATION (OriginalValues NUMBER, MaxNumber NUMBER, MinNumber NUMBER)
RETURN NUMBER AS
BEGIN
RETURN (OriginalValues - MinNumber)/(MaxNumber - MinNumber);
END NORMALIZATION;
/
CREATE TABLE X (
AGE NUMBER(5) CONSTRAINT AgePK PRIMARY KEY
);
INSERT INTO X VALUES (1);
INSERT INTO X VALUES (3);
INSERT INTO X VALUES (5);
INSERT INTO X VALUES (32);
INSERT INTO X VALUES (25);
INSERT INTO X VALUES (102);
INSERT INTO X VALUES (109);
INSERT INTO X VALUES (111);
SELECT Age, NORMALIZATION(Age, MAX(Age), MIN(Age)) AS NormalizedAge
FROM X
GROUP BY Age;
如果你用min
和max
值测试你的选择
SELECT Age, MAX(Age), MIN(Age)
FROM X
group by age;
你会得到
Age Min max
1 1 1
3 3 3
5 5 5
25 25 25
32 32 32
102 102 102
109 109 109
111 111 111
所以功能的结果应该不足为奇
(OriginalValues - MinNumber)/(MaxNumber - MinNumber)
(1 - 1) / (1 - 1) -- for the first Row
(2 - 2) / (2 - 2) -- for the second Row
等等
您可以使用分析函数来获取最小值和最大值
SELECT Age
, min(age) over () as min_val
, max(age) over () as max_val
FROM X
group by age;
结果
Age min max
1 1 111
3 1 111
5 1 111
25 1 111
32 1 111
102 1 111
109 1 111
111 1 111
你选择coul看起来像
select age,
NORMALIZATION(age,max_val,min_val)
from ( SELECT Age
, min(age) over () as min_val
, max(age) over () as max_val
FROM X
group by age
);
您应该将其拆分并查看问题所在。除以0很可能是由于Min(年龄)与max(年龄)相同
我认为问题出在你的SELECT中
我无法解决atm问题,但你可以尝试运行它:
SELECT age
, NORMALISATION(age, (SELECT MAX(age) FROM X), (SELECT MIN(age) FROM X)) as normalisedAge
FROM X