sql >> Databasteknik >  >> RDS >> PostgreSQL

Samla alla värden som inte tillhör samma grupp

I Postgres 11 eller senare, använd ett fönster funktion med en anpassad ram och en frame_exclusion :

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

Om name är inte UNIQUE , och eftersom du frågade:

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

db<>fiol här

Den första fungerar (också) med godtycklig ordning av rader, endast exklusive den nuvarande. Den andra kräver ORDER BY för att fastställa vilka rader som finns i samma grupp.

Handboken:

Djärv betoning min.

Detta använder den anpassade aggregatfunktionen array_combine(anyarray) tillhandahålls av a_horse .
Eller här:



  1. Upptäck om raden har uppdaterats eller infogats

  2. Tilldela samma id till rader med samma kombination av data

  3. Mysql-fel:Användaren som har angetts som definierare ('mysql.infoschema'@'localhost') existerar inte' när han försöker dumpa tabellutrymmen

  4. Olika CURRENT_TIMESTAMP och SYSDATE i oracle