首页 > 解决方案 > 用基于 2 个键(列值)的值替换 Null,Postgresql

问题描述

我放弃了寻找自己的答案来执行以下操作(叹气):

城市名 纬度 液化天然气
一个 1 10
无效的 2 20
无效的 3 30
b 2 20
C 3 30

我正在处理一个包含大量空值的大型数据集,例如上面的“city_name”。根据“lat”、“lng”中的值,我知道第一个空值是“b”,第二个空值是“c”。

该表有超过 1000 个不同的城市名称和 15000 个空值,可以通过查找具有相同 lat 和 lng 值的行来更正这些空值。根据纬度(lat 列)和经度(lng 列)手动用城市名称替换空值似乎是不可能的。

我希望空值是基于同一行中的 lat 和 lng 的城市名称。也许有一种方法可以引用具有相同 lat 和 lng 的其他行,从中获取城市名称,然后将 null 替换为城市名称?

有没有办法像上面那样在 POSTGRESQL 中一次用城市名称替换所有空值?

提前致谢!

标签: sqlpostgresql

解决方案


在查询中,您可以使用:

select t.*,
       max(city_name) over (partition by lat, lng) as imputed_cityname
from t;

如果要更新null值,可以使用:

update t
    set city_name = ll.city_name
    from (select lat, lng, max(city_name) as city_name
          from t
          group by lat, lng
         ) ll
    where ll.lat = t.lat and ll.lng = t.lng and
          t.city_name is null;

是一个 db<>fiddle。


推荐阅读