From: | Mihail Nasedkin <m(dot)nasedkin(at)gmail(dot)com> |
---|---|
To: | Dmitriy Igrishin <dmitigr(at)gmail(dot)com> |
Cc: | pgsql-ru-general(at)postgresql(dot)org |
Subject: | Re: [pgsql-ru-general] Re: Агрегация массивов |
Date: | 2010-12-13 06:47:51 |
Message-ID: | AANLkTimX0AW2UCcnCSuRiFPoBCzYPW4Rcm55XtGwRPtL@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-ru-general |
Да, я тоже позже заметил, что создал дубликат функции.
Проверял эффективность трех вариантов агрегации массивов в массив
упомянутых в данном обсуждении на своих наборах данных (не более
миллиона идентификаторов во всех массивах):
1. string_to_array(
array_to_string(
array_concat(
array_to_string(
.........
2. Вариант Дмитрия array_agg(...) ... unnest(...)
3. Агрегат на основе array_cat
Так вот отличий не увидел. Чисто эстетически нравится последний вариант.
13.12.10, Dmitriy Igrishin<dmitigr(at)gmail(dot)com> написал(а):
> Кстати, в Постгресе есть функция 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.
>
--
---
С уважением,
Михаил Наседкин
From | Date | Subject | |
---|---|---|---|
Next Message | leopard_ne@inbox.ru | 2011-02-06 11:05:38 | Создание GIST индексам для сравнения картинок (intarray) |
Previous Message | Dmitriy Igrishin | 2010-12-12 19:44:16 | Re: [pgsql-ru-general] Re: Агрегация массивов |