PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Les valeurs de tableau s'affichent ligne par ligne pour un identifiant unique à l'aide de Postgresql

Vous souhaitez regrouper vos données, donc l'endroit où chercher est dans [liste de fonctions d'agrégation] (https://www.postgresql.org/docs/current/functions-aggregate.html ), dans ce cas, il s'agit de string_agg ( value text, delimiter text ) → text

Vous souhaitez concaténer les données des noms et des services et vous souhaitez que les noms et les services soient sur des lignes distinctes, comme indiqué dans l'exemple. Pour cela le E'\n' le délimiteur doit être utilisé :

SELECT
  id,
  string_agg(name, E'\n') as names,
  string_agg(dept, E'\n') as depts
FROM 
  data
GROUP BY
  id
ORDER BY
  id;

La réponse vous montre comment et les commentaires expliquent pourquoi pas . Le choix vous appartient maintenant.

MODIFICATION 1

Si vous préférez conserver le nombre d'enregistrements et afficher l'ID avec la première ligne du groupe, alors vous devriez vous pencher sur les fonctions de la fenêtre. Plus précisément LAG .

SELECT
  CASE 
    WHEN id IS DISTINCT FROM LAG(id) OVER(order by id) THEN id 
    ELSE null 
  END as id,
  name,
  dept
FROM 
  data
order by
  data.id;

Le sql compare l'identifiant actuel à celui de la ligne précédente et le renvoie ou une valeur nulle.