2012-08-28 63 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

這會返回其中一個值,但不會返回最近的值。因此,它不回答這個問題。 –