Une possibilité est de commencer par grouper par x et utilisez array_agg() pour obtenir les tableaux internes. Ensuite, agrégez à nouveau en utilisant array_agg() pour obtenir les tableaux internes dans un tableau externe.
SELECT array_agg(a ORDER BY x)
FROM (SELECT x,
array_agg(val ORDER BY y) a
FROM t1
GROUP BY x) t;