Re: [pgsql-ru-general] Re: Агрегация массивов

From: Dmitriy Igrishin <dmitigr(at)gmail(dot)com>
To: Mihail Nasedkin <m(dot)nasedkin(at)gmail(dot)com>
Cc: pgsql-ru-general(at)postgresql(dot)org
Subject: Re: [pgsql-ru-general] Re: Агрегация массивов
Date: 2010-12-12 19:44:16
Message-ID: AANLkTikopBueCrBODHrGAy3D=F7FdpFBQh09g_q5n-1C@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-ru-general

Кстати, в Постгресе есть функция array_cat, которая делает
то же, что и Ваша "специть2массива".

Я полагаю, что array_agg реализован эффективнее, чем собственно
созданный аггрегат, вызывающий ту или иную функцию конкатенации.

Впрочем, это надо проверять. Решать Вам.

12 декабря 2010 г. 21:00 пользователь Mihail Nasedkin
<m(dot)nasedkin(at)gmail(dot)com>написал:

> В последний мой вариант отличается от первого включением в
> результирующий массив всех (и null-значений элементов).
>
> Связка string_to_array(array_to_string(...), ...) полезна в случае,
> если нужно отбросить null-значения. Для второго варианта эту связку
> также можно использовать в функции "сцепить2массива".
>
> Быстродействие этих двух вариантов у меня не отличалось.
>
> 12.12.10, Mihail Nasedkin<m(dot)nasedkin(at)gmail(dot)com> написал(а):
> > А ошибка в имени функции:
> >
> > CREATE AGGREGATE agregate_array2array (
> > sfunc = "сцепить2массива",
> > basetype = anyarray,
> > stype = anyarray,
> > initcond = '{}'
> > );
> >
> > 12.12.10, Mihail Nasedkin<m(dot)nasedkin(at)gmail(dot)com> написал(а):
> >> Вот к чему стремился, нарыл в интернете из разных примеров:
> >>
> >> CREATE OR REPLACE FUNCTION "сцепить2массива"(anyarray, anyarray)
> >> RETURNS anyarray AS
> >> ' BEGIN RETURN $1 || $2; END;'
> >> LANGUAGE 'plpgsql';
> >>
> >> CREATE AGGREGATE agregate_array2array (
> >> sfunc = array_concat,
> >> basetype = anyarray,
> >> stype = anyarray,
> >> initcond = '{}'
> >> );
> >>
> >> select id,
> >> agregate_array2array(arr)
> >>
> >> from (
> >> values
> >> (0, array[0]),
> >> (1, array[1,2]),
> >> (1, array[3,4,5])
> >> ) v (id, arr)
> >>
> >> group by id
> >> ;
> >>
> >> Вообще понимания агрегации у меня нету.
> >>
> >> 12.12.10, Mihail Nasedkin<m(dot)nasedkin(at)gmail(dot)com> написал(а):
> >>> Как обычно, доброго всем.
> >>>
> >>> Встала задача агрегировать не одиночные значения, а массивы в один
> >>> результирующий массив.
> >>> Пока смог реализовать такой, неуклюжий вариант:
> >>>
> >>> select id,
> >>>
> >>> string_to_array(
> >>> array_to_string(
> >>> array_concat(
> >>> array_to_string(arr, ',')
> >>> )
> >>> , ',')
> >>> , ',')::int[]
> >>>
> >>> from (
> >>> values
> >>> (0, array[0]),
> >>> (1, array[1,2]),
> >>> (1, array[3,4,5])
> >>> ) v (id, arr)
> >>>
> >>> group by id
> >>> ;
> >>>
> >>> Результат:
> >>> 1;"{1,2,3,4,5}"
> >>> 0;"{0}"
> >>>
> >>> Результат тот, который требуется, но можно ли сделать агрегацию
> >>> массивов в одной функции?
> >>>
> >>> --
> >>> ---
> >>> С уважением,
> >>> Михаил Наседкин
> >>>
> >>
> >>
> >>
> >> --
> >> ---
> >> С уважением,
> >> Михаил Наседкин
> >>
> >
> >
> > --
> > ---
> > С уважением,
> > Михаил Наседкин
> >
>
>
> --
> ---
> С уважением,
> Михаил Наседкин
>
> --
> Sent via pgsql-ru-general mailing list (pgsql-ru-general(at)postgresql(dot)org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-ru-general
>

--
// Dmitriy.

In response to

Responses

Browse pgsql-ru-general by date

  From Date Subject
Next Message Mihail Nasedkin 2010-12-13 06:47:51 Re: [pgsql-ru-general] Re: Агрегация массивов
Previous Message Mihail Nasedkin 2010-12-12 18:00:36 Re: Агрегация массивов