Заполните значение NULL самым последним значением из того же столбца.

Я пытаюсь заполнить значения NULL в столбце самым последним значением, отличным от NULL, в этом столбце. Например, в приведенном ниже примере я хочу, чтобы столбец IG для значений FR и первого SPR был равен «1», но конечное значение SPR было равно «0».

Поскольку я пытаюсь отслеживать изменения в переменной IG с течением времени для заданного идентификатора задачи, мне это нужно, чтобы убедиться, что я не заполняю значения NULL для одного идентификатора проблемы результатами из другого идентификатора проблемы.

Мне удалось обновить значения NULL с помощью следующего кода. Проблема в том, что это не может определить последнее значение, отличное от NULL. Кажется, что он просто берет значение IG для любого значения, отличного от NULL, которое находится перед рассматриваемой строкой.

Например, для строки, содержащей SPR и «2002-12-02», переменная IG заполняется «1», а не желаемым «0».

Любая помощь будет ОЧЕНЬ оценена.

Пример кода:

UPDATE ratings_base a
    SET ig =  b.ig
    FROM 
    (
     SELECT issue_id,
            rating,
            date,
            IG
    FROM ratings_base
    WHERE agency = 'MR' 
    ) b
WHERE a.rating IS NOT NULL
AND a.agency != 'MR'
AND b.date < a.date
AND a.issue_id = b.issue_id;

Пример данных:

Issue_ID | Agency |    Date    | Rating | IG
---------------------------------------------
1        | MR     | 2002-05-29 |   8    | 1 
1        | MR     | 2002-08-14 |   8    | 1
1        | FR     | 2002-08-19 |   11   | NULL
1        | SPR    | 2002-09-23 |   9    | NULL
1        | MR     | 2002-10-02 |   9    | 1
1        | MR     | 2002-11-26 |   11   | 0
1        | SPR    | 2002-12-02 |   12   | NULL
2        | MR     | 2002-08-14 |   8    | 1
2        | MR     | 2002-08-17 |   8    | 1

person user2845013    schedule 03.03.2015    source источник
comment
WHERE a.rating IS NOT NULL, ты уверен, что IS NULL здесь не должно быть?   -  person Giorgi Nakeuri    schedule 03.03.2015
comment
Привет, Джорджи, извини, но в моем полном наборе данных есть несколько случаев, когда переменная «Рейтинг» имеет значение NULL (не показано в моем примере). Это не опечатка в моем коде. Я, вероятно, также хотел бы добавить условие, где переменная «IG» IS NULL. Спасибо   -  person user2845013    schedule 03.03.2015
comment
извините, я думал, что это IG по сравнению с не нулевым   -  person Giorgi Nakeuri    schedule 03.03.2015


Ответы (1)


Как насчет перемещения подзапроса в update и убедитесь, что порядок правильный, чтобы получить последнее значение ig:

UPDATE ratings_base a
SET ig = (
  SELECT b.ig
  FROM ratings_base b
  WHERE a.issue_id = b.issue_id
  AND b.agency = 'MR' 
  AND b.date < a.date
  ORDER BY b.date DESC
  LIMIT 1
)
WHERE a.rating IS NOT NULL
AND a.agency != 'MR';
person Gareth Flowers    schedule 03.03.2015