Функция SQL Developer Create для нахождения статистической нормализации - PullRequest
1 голос
/ 30 апреля 2019

Я пытаюсь создать функцию, которая вычисляет статистические нормализованные значения таблицы чисел. Я продолжаю получать ошибку ORA-01476: делитель равен нулю. HELP !!!

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;

Ответы [ 2 ]

1 голос
/ 30 апреля 2019

если вы проверяете ваш выбор с 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
     );
0 голосов
/ 30 апреля 2019

Вы должны разделить это и посмотреть, где проблема. Деление на 0, скорее всего, связано с тем, что Min (возраст) совпадает с max (возраст)

Я думаю, что проблема в вашем SELECT

Я не могу выполнить диагностику через банкомат, но не могли бы вы попробовать запустить его так:

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