Re: Strict min and max aggregate functions

Поиск
Список
Период
Сортировка
От Pavel Stehule
Тема Re: Strict min and max aggregate functions
Дата
Msg-id CAFj8pRCoM40DpnGDx2dkzWdpvsEeBDRH+eGJ_EnjUBEWUSZFZw@mail.gmail.com
обсуждение исходный текст
Ответ на Strict min and max aggregate functions  (Jeff Janes <jeff.janes@gmail.com>)
Ответы Re: Strict min and max aggregate functions  (Jeff Janes <jeff.janes@gmail.com>)
Список pgsql-general


2016-11-19 22:12 GMT+01:00 Jeff Janes <jeff.janes@gmail.com>:
I need "strict" MIN and MAX aggregate functions, meaning they return NULL upon any NULL input, and behave like the built-in aggregates if none of the input values are NULL.

This doesn't seem like an outlandish thing to want, and I'm surprised I can't find other discussion of it.  Perhaps because none of the words here are very effective as search terms as they are so individually common.

I've hit upon a solution that works, but it is both ugly and slow (about 50 fold slower than the built-ins; for my current purpose this is not a big problem but I would love it to be faster if that could be done easily).  

So here is my approach.  Any suggestions to improve it?  Or are there better canned solutions I've failed to find?


-- If no values have been delivered to the aggregate, the internal state is the
-- NULL array.  If a null values has been delivered, the internal status is an
-- array with one element, which is NULL.  Otherwise, it is an array with one element,
-- the least/greatest seen so far.

CREATE OR REPLACE FUNCTION strict_min_agg (anyarray,anyelement )
RETURNS anyarray LANGUAGE sql IMMUTABLE AS $$
        SELECT CASE
            WHEN $1 IS NULL THEN ARRAY[$2]
            WHEN $1[1] IS NULL THEN $1
            WHEN $2 IS NULL THEN ARRAY[$2] -- use $2 not NULL to preserve type
            ELSE ARRAY[least($1[1],$2)] END ;
$$;


CREATE OR REPLACE FUNCTION strict_min_final (anyarray)
RETURNS anyelement LANGUAGE sql IMMUTABLE AS $$
        SELECT CASE WHEN $1 IS NULL THEN NULL ELSE $1[1] END ;
$$;

CREATE AGGREGATE strict_min (x anyelement) (
        sfunc     = strict_min_agg,
        stype     = anyarray,
        finalfunc = strict_min_final
);

can you use plpgsql instead sql?

you can use composite type instead array too.

Regards

Pavel


Cheers,

Jeff

В списке pgsql-general по дате отправления:

Предыдущее
От: Man
Дата:
Сообщение: Re: [HACKERS] How to change order sort of table in HashJoin
Следующее
От: Thomas Kellerer
Дата:
Сообщение: Re: Strict min and max aggregate functions