W Postgresie 11 lub później użyj okna funkcja z niestandardową ramką i frame_exclusion
:
SELECT *, array_combine(values) OVER (ROWS BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING
EXCLUDE CURRENT ROW) AS agg_values
FROM tbl;
Jeśli name
nie jest UNIQUE
, a skoro zapytałeś:
SELECT *, array_combine(values) OVER (ORDER BY name
ROWS BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING
EXCLUDE GROUP) AS agg_values
FROM tbl;
db<>fiddle tutaj
Pierwsza (również) działa z dowolną kolejnością wierszy, wyłączając tylko bieżący. Drugi wymaga ORDER BY
aby ustalić, które wiersze znajdują się w tej samej grupie.
Pogrubiony nacisk na moje.
Używa niestandardowej funkcji agregującej array_combine(anyarray)
dostarczone przez a_horse
.
Lub tutaj:
- Wybieranie danych do tablicy Postgres
- Czy jest coś takiego jak funkcja zip() w PostgreSQL, która łączy dwie tablice?