Как заменить нулевое значение предыдущим ненулевым значением?

0

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

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

Благодарю.

  • 1
    Пожалуйста, предоставьте образец данных и желаемых результатов. Вы также должны объяснить логику, которую вы используете для заполнения значения.
  • 0
    Запустите запрос с EXPLAIN и покажите нам результаты. Также скажите нам, сколько записей это медленно и что подмножество
Показать ещё 1 комментарий
Теги:

2 ответа

0

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

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

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

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).

  • 0
    Будет ли AND external_table.value_column = 0 помочь в подзапросе?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню