【问题标题】:SQL Developer Create Function to find statistical normalizationSQL Developer 创建函数以查找统计规范化
【发布时间】:2019-04-30 13:22:11
【问题描述】:

我正在尝试创建一个计算数字表的统计标准化值的函数。我不断收到错误 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


    【解决方案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
    

    你选择的样子

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

    【讨论】:

      【解决方案2】:

      你应该把它分开,看看问题出在哪里。 除以 0 很可能是因为 Min(age) 与 max(age) 相同

      我认为问题出在您的 SELECT 中

      我无法对 atm 进行故障排除,但你可以尝试像这样运行它吗:

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

      【讨论】:

        猜你喜欢
        • 2014-12-19
        • 2017-05-09
        • 1970-01-01
        • 2013-09-27
        • 2014-12-02
        • 2020-04-06
        • 2014-10-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多