MySQL меняет значение NULL на последнее значение, отличное от NULL - PullRequest
0 голосов
/ 25 октября 2019

У меня есть следующие столбцы в таблице:

time       action
2019-03-03 ticket start
2019-03-04 redirection
2019-03-05 working
2019-03-07 NULL
2019-03-08 NULL
2019-03-11 problem 1 solved
2019-03-14 redirection
2019-03-15 NULL
2019-03-16 ticket closed

Я могу изменить значения NULL на все, что захочу (с IFNULL), это не проблема, но я хочу изменить его на последнее значение, отличное отЗНАЧЕНИЕ NULL. Итак, таблица будет выглядеть так:

time       action
2019-03-03 ticket start
2019-03-04 redirection
2019-03-05 working
2019-03-07 working
2019-03-08 working
2019-03-11 problem 1 solved
2019-03-14 redirection
2019-03-15 redirection
2019-03-16 ticket closed

Возможно ли это с помощью запроса MySQL? Спасибо ..

Ответы [ 4 ]

1 голос
/ 25 октября 2019

Используйте coalesce() для action, поэтому, когда значение равно null, подзапрос вернет предыдущее значение, отличное от null:

select
  t.time,
  coalesce( 
    t.action, (
      select action from tablename 
      where time = (
        select max(time) from tablename
        where time < t.time and action is not null
      )  
    )
  ) action
from tablename t 

См. Демонстрационную версию . Результаты:

| time                | action           |
| ------------------- | ---------------- |
| 2019-03-03 00:00:00 | ticket start     |
| 2019-03-04 00:00:00 | redirection      |
| 2019-03-05 00:00:00 | working          |
| 2019-03-07 00:00:00 | working          |
| 2019-03-08 00:00:00 | working          |
| 2019-03-11 00:00:00 | problem 1 solved |
| 2019-03-14 00:00:00 | redirection      |
| 2019-03-15 00:00:00 | redirection      |
| 2019-03-16 00:00:00 | ticket closed    |
0 голосов
/ 25 октября 2019

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

Конечно, вы можете использовать coalesce, join или подзапросы, но почему бы не упростить задачу?

Для получения последнего значения, отличного от NULL (или другого значения), просто используйте функцию if() вместе с определенной пользователем переменной:

SELECT time, IF(action IS NULL, @action, @action:= action) as action FROM t order by time

0 голосов
/ 25 октября 2019

Вы также можете использовать подвери с пользователем var, например:

SELECT
    `time`,
    if( `action` is NULL , @last_action , @last_action:=action) as action
FROM (
    SELECT `time`, `action`
    FROM your_table
    ORDER BY time ASC
 ) as tmp
 CROSS JOIN ( SELECT @last_action := "FIRST ROW") as init;

Текст «ПЕРВАЯ СТРОКА» - это вывод, если первая строка пуста

sanmple: https://www.db -fiddle.com / f / h1hWAahprWWDV3dgSVixPX / 0

Образец

    time               action
2019-03-03 00:00:00  ticket start
2019-03-04 00:00:00  redirection
2019-03-05 00:00:00  working
2019-03-07 00:00:00  working
2019-03-08 00:00:00  working
2019-03-11 00:00:00  problem 1 solved
2019-03-14 00:00:00  redirection
2019-03-15 00:00:00  redirection
2019-03-16 00:00:00  ticket closed
0 голосов
/ 25 октября 2019

Помимо ответа @forpas, который является запросом SELECT, вы можете обновить таблицу, если хотите, чтобы значения NULL обновлялись с использованием последнего известного ненулевого значения

UPDATE your_table t1
INNER JOIN (
   SELECT action, max(time) time FROM your_table t1 GROUP BY action ORDER BY time DESC
) t2 
SET t1.action = t2.action
WHERE t1.action IS NULL AND t2.action IS NOT null AND t1.time > t2.time;

DB-Fiddle : https://www.db -fiddle.com / f / foBdWrSx5RT2KYuWtTA4Gv / 0

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