Найти мин или макс в пользовательской статистической функции postgresql - PullRequest
0 голосов
/ 06 марта 2019

Я новичок в Postgresql (я программирую на PL / pgSQL, нет большой разницы с sql). Я написал свою обычную агрегатную функцию, которая должна найти значение min или max в числовом массиве. Это агрегатный код функции

CREATE OR REPLACE FUNCTION searchMaxValue (numeric[]) RETURNS numeric AS $$
DECLARE 
i numeric;
maxVal numeric;
BEGIN
maxVal = $1[1];
IF ARRAY_LENGHT($1,1) > 0 THEN --Checking whether the array is empty or  not
   <<confrontoMassimo>>
   FOREACH i IN ARRAY $1 LOOP --Looping through the entire array, passed as parameter
       IF maxVal <= $1[i] THEN
           maxVal := $1[i];
       END IF;
   END LOOP confrontoMassimo;
   ELSE
   RAISE NOTICE 'Invalid parameter % passed to the aggregate function',$1;
   --Raising exception if the parameter passed as argument points to null.
   RAISE EXCEPTION 'Cannot find Max value. Parameter % is null', $1
   USING HINT = 'You cannot pass a null array! Check the passed parameter';

END IF;
RETURN maxVal;
END;
$$ LANGUAGE plpgsql;

 CREATE AGGREGATE searchMaxValueArray (numeric)
(
sfunc = array_append,
stype = numeric[],
finalfunc = searchMaxValue,
initCond = '{}'
);

Проблема в том, что он работает не так, как ожидалось. В чем проблема?

1 Ответ

2 голосов
/ 06 марта 2019

Как упоминалось выше, в вашей функции есть небольшая опечатка; ARRAY_LENGHT должно быть ARRAY_LENGTH.

Кроме этого, единственная проблема, которую я вижу, здесь:

FOREACH i IN ARRAY $1 LOOP
    IF maxVal <= $1[i] THEN
        ...

В цикле FOREACH целевая переменная i - это не индекс массива, а сам элемент массива. Другими словами, цикл должен быть:

FOREACH i IN ARRAY $1 LOOP
    IF maxVal <= i THEN
        maxVal := i;
    END IF;
END LOOP

С этими изменениями, похоже, работает как ожидалось: https://rextester.com/FTWB14034

...