【问题标题】:Replace Nulls with Values Based on 2 Keys (Column Values), Postgresql用基于 2 个键(列值)的值替换空值,Postgresql
【发布时间】:2021-05-30 16:11:38
【问题描述】:

我放弃了寻找自己的答案来做以下事情(叹气):

city_name lat lng
a 1 10
NULL 2 20
NULL 3 30
b 2 20
c 3 30

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

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

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

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

提前致谢!

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    在查询中您可以使用:

    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;
    

    Here 是一个 dbfiddle。

    【讨论】:

    • @DanK 。 . .当然可以。我添加了一个 dbfiddle.
    • 是的!我再次检查了它,并确认它确实如此!再次感谢戈登!
    • 我还有一个问题,戈登。我尝试做与上面相同的添加条件,例如子查询和外部的 where 子句。但它更新的行数比预期的要多。当我想用特定条件填充空值时,我是否必须更改任何内容?
    • 请用正确的解释和您正在使用的查询提出另一个问题。
    猜你喜欢
    • 2021-10-30
    • 2020-10-17
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 2019-01-02
    • 1970-01-01
    • 1970-01-01
    • 2018-12-01
    相关资源
    最近更新 更多