1

データベース内の重複する値をすべて削除する必要があります。十分に単純です。しかし、彼らはまた、私が調べて、そのレコードの以前のエントリでNullではなかったNull値があるかどうかを確認することを望んでいます。

したがって、ユーザー123があるとします。ユーザー123には、何らかの理由で郵便番号がリストされていません。しかし、過去のエントリでは、彼は郵便番号55555を持っていました。私は、過去のエントリからその郵便番号で最新のエントリを更新してから、過去のエントリを削除することになっています。ユーザー123のエントリを1つだけ残し、郵便番号を55555にします。

更新部分のやり方がわかりません。誰か提案がありますか?
ありがとう!

4

2 に答える 2

2

更新方法は次のとおりです。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

そして、行を新しいテーブルに挿入します。

そして、もう1つの提案。別の質問をして、テーブル内のフィールドがどのようなものか、最後の値を検索するフィールドをよりよく理解してください。これにより、より良いソリューションのための追加情報が提供されます。

于 2012-08-28T14:59:39.557 に答える
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

このようにして、複製のすべてのギャップを埋めます。次に、重複を削除する必要があります。

于 2012-08-28T15:06:51.227 に答える