Вот один из способов:
WITH cte AS (
SELECT *,
MAX(CASE WHEN close > 0 THEN date END) OVER
(ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) AS last_date
FROM yourTable
)
SELECT
t1.id,
t1.date,
t1.close,
t2.close AS previous_close
FROM cte t1
LEFT JOIN yourTable t2
ON t2.date = t1.last_date
ORDER BY t1.date DESC;
Стратегия здесь такова, что CTE находит самую последнюю дату, соответствующую ненулевому закрытию, происходящему строго перед каждой данной строкой, как отсортировано по свидание. Затем все, что нам нужно сделать, это присоединить этот CTE обратно к исходной таблице, чтобы найти фактическое соответствие последнего предыдущего значения закрытия.