¿Cómo escribo una combinación con este criterio de coincidencia inusual?

Quiero "unir a la izquierda" una tabla para que un valor se una no solo a una fila coincidente, sino también a cualquier fila no coincidente posterior, hasta la siguiente fila coincidente. Para decirlo de otra manera, quiero rellenar nulos con el valor anterior no nulo.

Datos de muestra y resultado deseado:

Mesax:

 id 
----
  1
  2
  3
  4
  5

Mesay:

 id | val 
----+-----
  1 | a
  4 | b

Resultado deselect x.id, y.val from x left join y on x.id=y.id order by x.id;:

 id | val 
----+-----
  1 | a
  2 | 
  3 | 
  4 | b
  5 | 

Resultado deseado:

 id | val 
----+-----
  1 | a
  2 | a
  3 | a
  4 | b
  5 | b

Respuestas a la pregunta(7)

Su respuesta a la pregunta