Postgresql 如何使用PSQL中相同id的上次填充来填充空值?
我在PostgreSQL中有一个数据帧,如下所示,我想要每个id的最新记录,如果每个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
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