Una possibilità è prima raggruppare per x
e usa array_agg()
per ottenere gli array interni. Quindi aggrega di nuovo usando array_agg()
per ottenere gli array interni in un array esterno.
SELECT array_agg(a ORDER BY x)
FROM (SELECT x,
array_agg(val ORDER BY y) a
FROM t1
GROUP BY x) t;