Você deseja agrupar seus dados, então o local para procurar é em [lista de funções agregadas] (https://www.postgresql.org/docs/current/functions-aggregate.html ), neste caso é
string_agg ( value text, delimiter text ) → text
Você deseja concatenar os dados de nomes e departamentos e deseja que os nomes e departamentos estejam em linhas separadas, conforme mostrado no exemplo. Para isso o
E'\n'
delimitador deve ser usado:SELECT
id,
string_agg(name, E'\n') as names,
string_agg(dept, E'\n') as depts
FROM
data
GROUP BY
id
ORDER BY
id;
A resposta mostra como e os comentários explicam por que não . A escolha é sua agora.
EDITAR 1
Se você preferir preservar o número de registros e exibir o ID com a primeira linha do grupo, você deve procurar nas funções da janela. Especificamente 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;
O sql compara o id atual com o da linha anterior e gera um valor nulo.