2012-08-28 37 views
1

我刚刚负责删除数据库中的所有重复值。够简单。但他们也希望我通过并检查在该记录的以前的条目中是否有Null值不为空。删除dups并更新空值

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

我只是不确定如何执行更新部分。任何人有任何建议?
谢谢!

+0

请问什么数据库引擎? – gbn

+0

你怎么知道一个入口比另一个入口晚?如果您发布了表格定义,这将有所帮助。 (另外,您使用的是什么DBMS?MySQL?PostgreSQL?SQL Server?Oracle?) – ruakh

+0

提供数据库引擎和表架构。我们需要更多信息。 –

回答

2

下面介绍如何进行更新。它发现了拉链的最后一个值,然后更新领域,如果必要的话:

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 

并将行插入到新表中。

还有一条建议。再问一个问题,更好地理解表中字段的含义,以及要查找哪些字段最后一个值。这将提供更好的解决方案的额外信息。

+0

对不起的话题,你的书是否讨论EAV模型? – Kermit

+0

@njk。 。 。非常无关紧要。但是这个答案是“不”。我写的所有书籍都是关于数据分析/数据挖掘的,而不是关于构建数据库的。 –

+0

明白了。在使用EAV的医疗应用中,我对数据检索更加好奇。 – Kermit

0

你可以使用类似以下内容的语句:

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 

这样,你在你的重复填写所有空白。那么你只需删除重复项。

+0

这会返回其中一个值,但不会返回最近的值。因此,它不回答这个问题。 –