Как заменить нулевое значение предыдущим ненулевым значением? - PullRequest
0 голосов
/ 15 сентября 2018

Я хочу заменить нулевое значение на предыдущее ненулевое значение, используя 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

Это работает, но для больших наборов данных требуется очень много времени.Я попробовал это для подмножества данных, и это сработало.Есть ли более простой / эффективный способ добиться того же?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 15 сентября 2018

Исходя из вашего запроса, ваша первая проверка должна заключаться в том, что ваш дубль правильно проиндексирован по столбцу даты (и столбцу значений в качестве индекса покрытия). Если это так, то вы можете использовать следующий слегка упрощенный запрос.

Обратите внимание, это заменяет 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

(на моем телефоне, пожалуйста, прости опечатки)

0 голосов
/ 15 сентября 2018

Вы можете упростить запрос до:

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) может помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...