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

Как да използвам array_agg() за varchar[]

Стандартната агрегатна функция array_agg() работи само за базови типове, а не за типове масиви като вход.(Но Postgres 9.5+ има нов вариант на array_agg() това може!)

Можете да използвате персонализираната агрегатна функция array_agg_mult() както е дефинирано в този свързан отговор:
Избиране на данни в Postgres масив

Създайте го веднъж на база данни. Тогава вашата заявка може да работи по следния начин:

SELECT use.user_sched_id, array_agg(se.sched_entry_id) AS seids
      ,array_agg_mult(ARRAY[se.min_crew]) AS min_crew_arr
FROM   base.sched_entry se
LEFT   JOIN base.user_sched_entry use USING (sched_entry_id)
WHERE  se.sched_entry_id = ANY(ARRAY[623, 625])
GROUP  BY user_sched_id;

В свързания отговор има подробна обосновка.

Разширенията трябва да съвпадат

В отговор на вашия коментар помислете за този цитат от ръководството за типовете масиви:

Многоизмерните масиви трябва да имат съвпадащи екстенти за всяко измерение. Несъответствието причинява грешка.

Няма как да заобиколите това, типът на масива не позволява такова несъответствие в Postgres. Вие можете попълнете своите масиви с NULL стойности, така че всички измерения да имат съвпадащи екстенти.

Но бих предпочел да преведа масивите в списъци, разделени със запетая, с array_to_string() за целите на тази заявка и използвайте string_agg() за агрегиране на text - за предпочитане с различен разделител. Използване на нов ред в моя пример:

SELECT use.user_sched_id, array_agg(se.sched_entry_id) AS seids
      ,string_agg(array_to_string(se.min_crew, ','), E'\n') AS min_crews
FROM   ...

Нормализиране

Може да помислите за нормализиране на вашата схема като начало. Обикновено бихте внедрили такава връзка n:m с отделна таблица, както е описано в този пример:
Как да внедрите релация много към много в PostgreSQL?




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Колоната 'mary' не съществува

  2. Да се ​​изчисли максималната сума на анотирано поле върху групирано по заявка в Django ORM?

  3. PostgreSQL :прехвърляне на низ към дата ДД/ММ/ГГГГ

  4. пакет неуспешен - Не мога да намеря клиентската библиотека на PostgreSQL (libpq)

  5. postgresql последователност nextval в схемата