簡體   English   中英

如何用以前的非空值替換空值?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM