PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Конкатениране/сливане на стойности на масива по време на групиране/агрегиране

Персонализиран агрегат

Подход 1:дефинирайте персонализиран агрегат. Ето един, който написах по-рано.

CREATE TABLE my_test(title text, tags text[]);

INSERT INTO my_test(title, tags) VALUES
('ridealong', '{comedy,other}'),
('ridealong', '{comedy,tragedy}'),
('freddyjason', '{horror,silliness}');

CREATE AGGREGATE array_cat_agg(anyarray) (
  SFUNC=array_cat,
  STYPE=anyarray
);

select title, array_cat_agg(tags) from my_test group by title;

СТРАНИЧНА заявка

... или тъй като не искате да запазите реда и искате да дедуплирате, можете да използвате LATERAL заявка като:

SELECT title, array_agg(DISTINCT tag ORDER BY tag) 
FROM my_test, unnest(tags) tag 
GROUP BY title;

в този случай нямате нужда от персонализиран агрегат. Този вероятно е доста по-бавен за големи набори от данни поради дедупликацията. Премахване на ORDER BY ако не е необходимо, обаче може да помогне.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Напредък в онлайн надстройката

  2. Мониторинг и одит на производителността PostgreSQL - Топ ресурси

  3. Как да се справим с незадължителна стойност, върната от заявка, използвайки сандъка на postgres?

  4. Как да създам индекс на полето JSON в Postgres?

  5. Напълно деинсталирате PostgreSQL 9.0.4 от Mac OSX Lion?