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.