Я хочу заменить нулевое значение на предыдущее ненулевое значение, используя MySQL. Я попробовал это:
SELECT
'Date_Column'
,CASE
WHEN 'Value_Column' is null
THEN (
SELECT
'Value_Column'
FROM
table_name t2
WHERE
'Date_Column' = (
SELECT
MAX('Date_Column')
FROM
table_name t3
WHERE
'Date_Column' < t1.'Date_Column'
AND 'Value_Column' > 0
)
)
ELSE 'Value_Column'
END AS 'Value_Column'
FROM
table_name t1
Это работает, но занимает очень много времени для больших наборов данных. Я попробовал это для подмножества данных, и это сработало. Есть ли более простой и эффективный способ добиться того же?
Благодарю.
Основываясь на вашем запросе, ваша первая проверка должна состоять в том, что ваш запрос правильно индексируется столбцом даты (и столбцом значения в качестве индекса покрытия). Если это так, вы можете использовать следующий упрощенный запрос.
Обратите внимание, что это заменяет NULL в соответствии с вашим описанием, где ваш заменил 0 вопреки вашему описанию, вы должны четко указать, какое именно поведение вы хотите.
SELECT
date_column,
COALESCE(
value_column,
(
SELECT lookup.value_column
FROM table_name AS lookup
WHERE lookup.date_column < table_name.date_column
AND lookup.value_column IS NOT NULL
AND table_name.value_column IS NULL
ORDER BY lookup.date_column DESC
LIMIT 1
)
)
FROM
table_name
(на моем телефоне, пожалуйста, простите опечатки)
Вы можете упростить запрос:
SELECT t1.Date_Column
(CASE WHEN t1.Value_Column = 0
THEN (SELECT t2.Value_Column
FROM table_name t2
WHERE t2.Date_Column < t1.Date_Column AND t2.Value_Column > 0
ORDER BY t2.Date_Column DESC
LIMIT 1
)
ELSE t2.Value_Column
END) AS Value_Column
FROM table_name t1;
Это улучшает ваш запрос, поскольку он удаляет второй вложенный подзапрос. Но он все равно будет медленным. Может помочь index на table_name(Date_Column, Value_Column)
.
AND external_table.value_column = 0
помочь в подзапросе?
EXPLAIN
и покажите нам результаты. Также скажите нам, сколько записей это медленно и что подмножество