Oracle SQL开发人员创建函数以查找统计规范化

Oracle SQL开发人员创建函数以查找统计规范化,oracle,plsql,ddl,stored-functions,Oracle,Plsql,Ddl,Stored Functions,我试图创建一个函数来计算数字表的统计标准化值。我一直得到错误ORA-01476:除数等于零。救命啊 CREATE FUNCTION NORMALIZATION (OriginalValues NUMBER, MaxNumber NUMBER, MinNumber NUMBER) RETURN NUMBER AS BEGIN RETURN (OriginalValues - MinNumber)/(MaxNumber - MinNumber); END NORMALIZATION; /

我试图创建一个函数来计算数字表的统计标准化值。我一直得到错误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;

你应该把它分开,看看问题在哪里。 除以0很可能是因为最小值(年龄)与最大值(年龄)相同

我认为问题在于你的选择

我不能自动取款机,但你能试着像这样运行它吗

SELECT age
     , NORMALISATION(age, (SELECT MAX(age) FROM X), (SELECT MIN(age) FROM X)) as normalisedAge
  FROM X

如果您使用
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
你选择的是什么样子

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
     );