【问题标题】:Removing dups and updating null values删除重复和更新空值
【发布时间】:2012-08-23 02:37:45
【问题描述】:

我刚刚接到了删除数据库中所有重复值的任务。很简单。但他们也希望我检查一下在该记录的先前条目中是否有任何 Null 值不是 Null。

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

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

【问题讨论】:

  • 你怎么知道一个条目比另一个“晚”?如果您发布表定义会有所帮助。 (另外,您使用的是什么 DBMS?MySQL?PostgreSQL?SQL Server?Oracle?)
  • 提供数据库引擎和表架构。我们需要更多信息。
  • 数据库引擎将是 SQL Server。有一个“更新日期”字段或类似的东西。我自己还没有表模式。我不是在寻找一个确切的答案,只是我可以使用的一些想法。

标签: sql sql-server null duplicates


【解决方案1】:

以下是您可以进行更新的方法。它会找到 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

但是,我建议您使用所需数据创建一个新表。不要同时删除和更新无数行,使用如下查询创建表:

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

并将行插入到新表中。

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

【讨论】:

  • 抱歉跑题了,你的书讨论 EAV 模型吗?
  • @njk 。 . .非常离题。但那个答案是“不”。我写的所有书都是关于数据分析/数据挖掘的,而不是关于构建数据库的。
  • 知道了。我对使用 EAV 进行医疗应用中的数据检索更加好奇。
【解决方案2】:

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

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

这样您就可以填补副本中的所有空白。然后你只需要删除重复项。

【讨论】:

  • 这会返回其中一个值,但不是最近的值。因此,它没有回答这个问题。
猜你喜欢
  • 2022-11-02
  • 2011-07-06
  • 1970-01-01
  • 1970-01-01
  • 2015-03-11
  • 1970-01-01
  • 2016-08-16
  • 1970-01-01
  • 2020-06-22
相关资源
最近更新 更多