March 8, 2010

В ожидании 9.0 - string_agg (агрегируем строки)

Перевод Waiting for 9.0 – string_agg с select * from depesz;

(В январе 2010 г. команда разработчиков решила, что следующая версия PostgreSQL будет нумероваться 9.0, а не 8.5)


1 февраля Takahiro Itagaki применил патч от Pavel Stehule, который добавляет агрегат string_agg:

Добавляет агрегатные функции string_agg. Версия с одним аргументом конкатенирует входные значения в строку, с двумя аргументами то же самое, но ещё добавляет разделитель между элементами.

Патч от Pavel Stehule, проверен David E. Wheeler и мной.


В общем всё очень просто:

# select string_agg(x) from ( values ('d'), ('e'), ('p'), ('e'), ('s'), ('z') ) as t (x);
string_agg
------------
depesz
(1 row)


или

# select string_agg( relname, ', ' ) from (select relname from pg_class where relkind = 'r' limit 5 )x;
string_agg
--------------------------------------------------------------------
pg_statistic, pg_type, pg_attribute, x, active_threads_by_forum_id
(1 row)


Идея в общем не нова - я предлагал (извините, английской версии нет, только польская) одно решение в 2006. Потом появился array_agg - агрегат, который формирует массив, в сочетании с array_to_string делающий то же самое.

Что интересно в новинке - это скорость.

David Wheeler представил сравнительный тест с array_to_string(array_agg) на определённом наборе данных:

array_to_string(array_agg) – 1365.382 ms
string_agg – 17.989 ms

Это очень здорово.

1 comment:

Unknown said...

Nice Article !
This is my pleasure to read your article.
Really this will help to people of PostgreSQL Community.

I have also prepared one article about, Concat string per each group using PostgreSQL string_agg().
You can also visit my article, your comments and reviews are most welcome.

http://www.dbrnd.com/2016/09/postgresql-string_agg-to-concatenate-string-per-each-group-like-sql-server-stuff-string-aggregation-function/

Post a Comment