Вот подход, который должен работать без аналитических функций.В этом ответе используется подход соединения календарной таблицы.Первый CTE ниже - это базовая таблица, на которой основывается остальная часть запроса.Мы используем коррелированный подзапрос, чтобы найти самую последнюю дату раньше , чем текущая дата в CTE, цена которого не NULL
.Это основание для выяснения того, какими должны быть значения id
и price
для тех дат, приходящих из календарной таблицы, которые не отображаются в исходном наборе данных.
WITH cte AS (
SELECT cal.date, t.price, t.id
FROM
(
SELECT '2018-09-02' AS date UNION ALL
SELECT '2018-09-03' UNION ALL
SELECT '2018-09-04' UNION ALL
SELECT '2018-09-05' UNION ALL
SELECT '2018-09-06' UNION ALL
SELECT '2018-09-07' UNION ALL
SELECT '2018-09-08'
) cal
LEFT JOIN yourTable t
ON cal.date = t.date
),
cte2 AS (
SELECT
t1.date,
t1.price,
t1.id,
(SELECT MAX(t2.date) FROM cte t2
WHERE t2.date <= t1.date AND t2.price IS NOT NULL) AS nearest_date
FROM cte t1
)
SELECT
(SELECT t2.id FROM yourTable t2 WHERE t2.date = t1.nearest_date) id,
(SELECT t2.price FROM yourTable t2 WHERE t2.date = t1.nearest_date) price,
t1.date
FROM cte2 t1
ORDER BY
t1.date;
Демонстрация
Примечание. Чтобы это работало на версиях MySQL более ранних, чем 8+, вам потребуется встроитьCTE выше.Это приведет к подробному коду, но все равно должно работать.