Перейти к основному содержимому

intagg. Агрегатор и нумератор целых чисел

В исходном дистрибутиве установлено по умолчанию: нет.

Связанные компоненты: отсутствуют.

Схема размещения: ext.

Модуль предоставляет агрегатор и нумератор целых чисел.

Примечание:

Модуль intagg считается устаревшим, поскольку существуют встроенные функции с более широкими возможностями. Однако модуль intagg продолжает существовать как набор оболочек встроенных функций для обратной совместимости.

Функции модуля:

Тип функцииФункцияРезультатОписаниеОболочка
Агрегаторint_array_aggregate (integer)integer[] – массив целых чиселФункция выдает массив целых чисел, который содержит переданные ей числаОболочка встроенной функции array_agg, которая делает то же самое для массива любого типа
Нумераторint_array_enum (integer[])setof integer, возвращает набор целых чиселФункция возвращает набор целых; действие обратно действию агрегатора: получив массив целых, он разворачивает его в набор строкОболочка функции unnest, которая делает то же самое для массива любого типа

Доработка

Доработка не проводилась.

Ограничения

Ограничения отсутствуют.

Установка

При наличии прав администратора СУБД включение модуля возможно выполнить вручную:

CREATE EXTENSION intagg SCHEMA ext;

Настройка

Настройка не требуется.

Использование модуля

Таблица соотношений «один-ко-многим» обычно находится между двумя индексированными таблицами, например:

-- создать таблицы
CREATE TABLE lefti (id INT PRIMARY KEY, name text);
CREATE TABLE righti (id INT PRIMARY KEY, name text);
CREATE TABLE one_to_many (lefti INT REFERENCES lefti, righti INT REFERENCES righti);
-- заполнить таблицы тестовыми данными
INSERT INTO lefti VALUES (1,'First Left');
INSERT INTO lefti VALUES (2,'Second Left');
INSERT INTO lefti VALUES (3,'Third Left');
INSERT INTO lefti VALUES (4,'Fourth');
INSERT INTO righti VALUES (1,'First Right');
INSERT INTO righti VALUES (2,'Second Right');
INSERT INTO righti VALUES (3,'Third Right');
INSERT INTO righti VALUES (4,'Fourth');
INSERT INTO one_to_many VALUES (1,2);
INSERT INTO one_to_many VALUES (1,3);
INSERT INTO one_to_many VALUES (1,4);
INSERT INTO one_to_many VALUES (2,2);

Запрос вернет все элементы из таблицы справа для записи 1 в таблице слева:

SELECT righti.* from righti JOIN one_to_many ON (righti.id = one_to_many.righti)
WHERE one_to_many.lefti = 1;
SELECT lefti, righti FROM one_to_many WHERE lefti = 1;

Пример результата запроса:

 id |     name     
----+--------------
2 | Second Right
3 | Third Right
4 | Fourth
(3 rows)

Другой способ:

SELECT lefti, righti FROM one_to_many WHERE lefti = 1;

Пример результата запроса:

 lefti | righti 
-------+--------
1 | 2
1 | 3
1 | 4
(3 rows)

Создание сводной таблицы с применением агрегатора int_array_aggregate, которая содержит одну строку для каждого элемента слева с массивом элементов справа:

CREATE TABLE summary AS
SELECT lefti, int_array_aggregate(righti) AS righti
FROM one_to_many
GROUP BY lefti;

Запрос с вызовом нумератора int_array_enum:

SELECT lefti, int_array_enum(righti) FROM summary WHERE lefti = 1;

Пример результата запроса:

 lefti | int_array_enum 
-------+----------------
1 | 2
1 | 3
1 | 4
(3 rows)

Ссылки на документацию разработчика

Исходная документация PosgreSQL по модулю intagg: https://www.postgresql.org/docs/15/intagg.html.