我刚刚负责删除数据库中的所有重复值。很简单。但他们也希望我检查一下在该记录的先前条目中是否有任何 Null 值不是 Null。
因此,假设我们有用户 123。无论出于何种原因,用户 123 都没有列出邮政编码。但是在过去的条目中,他的邮政编码为 55555。我应该使用过去条目中的邮政编码更新最新条目,然后删除过去的条目。只留下一个用户 123 的条目并且邮政编码为 55555。
我只是不确定如何进行更新部分。有人有什么建议吗?
谢谢!
我刚刚负责删除数据库中的所有重复值。很简单。但他们也希望我检查一下在该记录的先前条目中是否有任何 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
这样,您就可以填补副本中的所有空白。然后你只需要删除重复项。