В Postgres 11 или по-късно използвайте прозорец функцията с персонализирана рамка и frame_exclusion
:
SELECT *, array_combine(values) OVER (ROWS BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING
EXCLUDE CURRENT ROW) AS agg_values
FROM tbl;
Ако name
не е UNIQUE
, и тъй като попитахте:
SELECT *, array_combine(values) OVER (ORDER BY name
ROWS BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING
EXCLUDE GROUP) AS agg_values
FROM tbl;
db<>fiddle тук
Първият (също) работи с произволен ред на редове, като изключва само текущия. Второто изисква ORDER BY
за да установите кои редове са в една и съща група.
Удебелен акцент е мой.
Това използва персонализираната агрегатна функция array_combine(anyarray)
предоставено от a_horse
.
Или тук:
- Избиране на данни в масив на Postgres
- Има ли нещо като функция zip() в PostgreSQL, която комбинира два масива?