删除重复数据块并更新空值



我刚刚被指派删除数据库中所有重复的值。很简单。但他们也希望我仔细检查,在该记录的以前条目中是否有任何Null值不是Null。

假设我们有用户123。无论出于何种原因,用户123都没有列出邮政编码。但在过去的一个条目中,他的邮政编码是55555。我应该用过去条目的邮政编码更新最新条目,然后删除过去的条目。只留下一个用户123的条目,并且邮政编码为55555。

我只是不确定如何进行更新部分。有人有什么建议吗
谢谢

以下是如何进行更新。它会找到zip的最后一个值,然后在必要时更新字段:

with lastval as (
    select *
    from (select id, zip, row_number() over (partition by id order by datecreated desc) as seqnum
          from t
          where zip is not null
         ) t
    where seqnum = 1
)
update t
    set t.zip = lastval.zip
    from lastval
    where t.id = lastval.id

不过,我建议您使用所需的数据创建一个新表。不要同时删除和更新zilion行,使用以下查询创建表:

select *
from (select t.*, row_number() over (partition by id order by datecreated desc) as seqnum
      from t
      where zip is not null
     ) t
where seqnum = 1

并将行插入到一个新表中。

还有一个建议。再问一个问题,更好地了解表中的字段是什么样的,以及你想查找最后的值。这将为更好的解决方案提供更多信息。

您可以使用类似于以下语句的语句:

update t1
set t1.address = dt.address,
    t1.city = dt.city,
    ... and so on ...
from your_table as t1
inner join 
(
select 
    max(id) as id,
    companyname,
    max(address) as address,
    max(city) as city,
    ... and so on ...
    from your_table
    group by companyname -- your duplicate detection goes here
) dt
on dt.id = t1.id

通过这种方式,您可以填补重复项中的所有空白。然后你只需要删除重复项。

最新更新