[英]How to replace a null value with previous non-null value?
我想使用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
這行得通,但對於大型數據集來說卻要花費很長時間。 我嘗試了此操作以獲取部分數據,但它確實有效。 有沒有更簡單/更有效的方法來實現這一目標?
謝謝。
您可以將查詢簡化為:
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;
這是您查詢的一項改進,因為它刪除了第二個嵌套子查詢。 但這仍然會很慢。 table_name(Date_Column, Value_Column)
上的索引可能會有所幫助。
根據您的查詢,您的第一項檢查應該是通過日期列(以及值列作為覆蓋索引)正確索引您的成交。 如果是這樣,則可以使用以下稍微簡化的查詢。
請注意,這將按照您的描述替換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
(在我的手機上,請原諒錯字)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.