sql >> Database >  >> RDS >> PostgreSQL

Alle waarden die niet in dezelfde groep zitten samenvoegen

In Postgres 11 of hoger, gebruik een venster functie met een aangepast frame en een frame_exclusion :

SELECT *, array_combine(values) OVER (ROWS BETWEEN UNBOUNDED PRECEDING
                                           AND UNBOUNDED FOLLOWING
                                           EXCLUDE CURRENT ROW) AS agg_values
FROM   tbl;

Als name is niet UNIQUE , en aangezien je vroeg:

SELECT *, array_combine(values) OVER (ORDER BY name
                                      ROWS BETWEEN UNBOUNDED PRECEDING
                                           AND UNBOUNDED FOLLOWING
                                           EXCLUDE GROUP) AS agg_values
FROM   tbl;

db<>fiddle hier

De eerste werkt (ook) met een willekeurige volgorde van rijen, alleen met uitzondering van de huidige. De tweede vereist ORDER BY om vast te stellen welke rijen zich in dezelfde groep bevinden.

De handleiding:

Vetgedrukte nadruk van mij.

Dit gebruikt de aangepaste aggregatiefunctie array_combine(anyarray) geleverd door a_horse .
Of hier:



  1. MySQL - Minimum EN Maximum selecteren in één (UNION) Query

  2. slechte Hibernate select-prestaties vergeleken met direct uitvoeren - hoe debuggen?

  3. MySQL - Is het mogelijk om LIKE op alle kolommen in een tabel te gebruiken?

  4. Afhankelijke vervolgkeuzelijst CakePHP 3