SQL Developer创建函数以查找统计规范化

问题描述 投票:1回答:2

我正在尝试创建一个计算数字表的统计标准化值的函数。我一直收到错误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;
oracle plsql ddl stored-functions
2个回答
1
投票

如果你用minmax值测试你的选择

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
投票

您应该将其拆分并查看问题所在。除以0很可能是由于Min(年龄)与max(年龄)相同

我认为问题出在你的SELECT中

我无法解决atm问题,但你可以尝试运行它:

SELECT age
     , NORMALISATION(age, (SELECT MAX(age) FROM X), (SELECT MIN(age) FROM X)) as normalisedAge
  FROM X
© www.soinside.com 2019 - 2024. All rights reserved.