Jednou z možností je nejprve seskupit podle x a použijte array_agg() získat vnitřní pole. Poté znovu agregujte pomocí array_agg() abyste dostali vnitřní pole do jednoho vnějšího pole.
SELECT array_agg(a ORDER BY x)
FROM (SELECT x,
array_agg(val ORDER BY y) a
FROM t1
GROUP BY x) t;