Postgresql 如何使用PSQL中相同id的上次填充来填充空值?

Postgresql 如何使用PSQL中相同id的上次填充来填充空值?,postgresql,Postgresql,我在PostgreSQL中有一个数据帧,如下所示,我想要每个id的最新记录,如果每个id的任何最新记录在任何列中都包含空值,我想用同一列中的下一个最新值替换它 资料 预期产量 最终输出 id ingdt code gender address 1 27-10-2018 1234 M street1 2 24-10-2018 2857 F Bstreet 3 24-08-2018 3489

我在PostgreSQL中有一个数据帧,如下所示,我想要每个id的最新记录,如果每个id的任何最新记录在任何列中都包含空值,我想用同一列中的下一个最新值替换它

资料

预期产量

最终输出

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
尝试

使用可以帮助您:

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
解释(…)上的第一个值(…)

窗口函数可以将行分组到单独的帧中。这是通过关键字
partitionby
完成的。在这种情况下,我为每个
id
生成帧

现在我正在检查列的值是否为
NULL
。这给了我
true
false
。我像任何
boolean
列一样对这个结果进行排序,并首先使用
false
(意思是
不为NULL
)。如果有许多
notnull
行,则取最新的一行(
ingdt DESC
)。此订购也针对每个单独的机架进行

first\u value()
计算有序帧的第一个值

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