Как заполнить нулевые значения, используя последнюю заливку для того же идентификатора в PSQL? - PullRequest
0 голосов
/ 31 октября 2018

У меня есть фрейм данных в PostgreSQL, как показано ниже, и я хочу, чтобы последняя запись для каждого идентификатора, если любая последняя запись для каждого идентификатора содержит значение NULL в любом столбце, я хочу заменить его на следующее последнее значение в том же самом колонка

данные

id    ingdt         code  gender  address   
1     27-10-2018    NULL  NULL    street1    
1     24-10-2018    1234  NULL    street2
1     20-08-2017    3245  M       street2
2     24-09-2018    NULL  F       Astreet
2     24-10-2018    2857  F       Bstreet
3     24-08-2018    3489  M       NULL
3     22-08-2018    5802  M       Cstreet

Ожидаемый результат

final_output

id    ingdt         code  gender  address   
1     27-10-2018    1234  M       street1   
2     24-10-2018    2857  F       Bstreet
3     24-08-2018    3489  M       Cstreet

Пытались

insert into final_output select * from (
(select code, id from data where code != null order by ingdt limit 1) x join
(select gender, id from data where gender != null order by ingdt limit 1) y join 
(select address, id from data where address != null order by ingdt limit 1)z on y.id=x.id)

1 Ответ

0 голосов
/ 31 октября 2018

демо: дб <> скрипка

Использование оконных функций может помочь вам:

SELECT DISTINCT
    id, 
    max(ingdt) OVER (PARTITION BY id),
    first_value(code) OVER (PARTITION BY id ORDER BY code IS NULL, ingdt DESC) AS code,
    first_value(gender) OVER (PARTITION BY id ORDER BY gender IS NULL, ingdt DESC) AS gender,
    first_value(address) OVER (PARTITION BY id ORDER BY address IS NULL, ingdt DESC) AS address
FROM mytable
ORDER BY id

Объясняя first_value(...) OVER (...):

Функция окна может группировать ваши строки в отдельные кадры. Это делается с помощью ключевого слова PARTITION BY. В этом случае я генерирую кадры для каждого id.

Теперь я проверяю, является ли значение столбца NULL. Это дает мне true или false. Я сортирую этот результат как любой boolean столбец с false первым (что означает NOT NULL). Если строк NOT NULL много, берется последняя строка (ingdt DESC). Этот порядок также выполняется для каждого отдельного кадра.

first_value() вычисляет первое значение упорядоченного кадра.

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