Skip site navigation (1) Skip section navigation (2)

Re: Агрегация массивов

From: Mihail Nasedkin <m(dot)nasedkin(at)gmail(dot)com>
To: pgsql-ru-general(at)postgresql(dot)org
Subject: Re: Агрегация массивов
Date: 2010-12-12 18:00:36
Message-ID: AANLkTik=wLqUiG9S0KwKco2R7WHePAuSV8RG1GvQTc=K@mail.gmail.com (view raw or flat)
Thread:
Lists: pgsql-ru-general
В последний мой вариант отличается от первого включением в
результирующий массив всех (и 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}"
>>>
>>> Результат тот, который требуется, но можно ли сделать агрегацию
>>> массивов в одной функции?
>>>
>>> --
>>> ---
>>> С уважением,
>>> Михаил Наседкин
>>>
>>
>>
>>
>> --
>> ---
>> С уважением,
>> Михаил Наседкин
>>
>
>
> --
> ---
> С уважением,
> Михаил Наседкин
>


-- 
---
С уважением,
Михаил Наседкин

In response to

Responses

pgsql-ru-general by date

Next:From: Dmitriy IgrishinDate: 2010-12-12 19:44:16
Subject: Re: [pgsql-ru-general] Re: Агрегация мас
Previous:From: Mihail NasedkinDate: 2010-12-12 17:26:56
Subject: Re: Агрегация массивов

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group