2017-10-31 22 views
1

各エンティティに固有のIDがあるデータベースがありますが、最近ではすべてのエンティティ名が読みやすさを向上させるために(同じ方法ではなく)変更されています。これらの変更は、異なる名前で標準ではなく、IDごとに異なります。同じIDの複数の値を持つデータベース

ID  Name   Total for the year  
3011 Joesmith   3000 
3011 Joe Smith   1000 
5024 DBS    400 
5024 Deborah Smith  150 

個々の行は次のようになります:

について行くのいずれかの古いエントリが一致して修正する最良の方法は何
ID  Name   Transaction  Date 
3011 Joesmith  2000    January 1, 2017 
3011 Joesmith  1000    January 2, 2017 
3011 Joe Smith  500    February 1, 2017 
3011 Joe Smith  500    February 5, 2017 

これは、要約レポートの多くは、以下のようになりなりました新しいものか、または一致するIDの新しい名前を表示するだけですか?最後にIDの使用だけで私たちが興味を持っている要約を得ることができますが、最終的に私たちの名前を見て解釈したいと思います。

私たちは、名前が異なる1000以上のIDと、合計で50,000行程度のIDを見ています。

+0

「データベース」という言葉があるので、「r」と「excel」タグを削除した。実際に使用しているツールで自由にタグを付けてください。 –

+0

申し訳ありませんが、クリーンアッププロジェクトの面では、私は無関心です.ExcelまたはOpen Refineなどで達成するのが簡単な場合、または何でもできることがあれば – nerb

+0

Joe Smithのどのバージョンで新しい価値があるのですか? – SEarle1986

答えて

2

オプションA:

UPDATE A 
SET A.Name = B.Name 
FROM YourTable A 
JOIN (SELECT ID, Name, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Date DESC) RN 
     FROM YourTable) B ON A.ID = B.ID AND B.RN = 1 

オプションB:IDごとの最新の名前を取得するには、テーブルに戻って参加するようにレポートを変更し、IDごとの最新の名前を使用してテーブルを更新します。

SELECT A.ID, B.Name, SUM(Transaction) TotalForTheYear 
FROM YourTable A 
JOIN (SELECT ID, Name, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Date DESC) RN 
     FROM YourTable) B ON A.ID = B.ID AND B.RN = 1 
GROUP BY A.ID, B.Name 

これらはROW_NUMBER()を使用します(主にMySQLの)すべてのDBMSでは利用できません。ここでは一つの方法です。 ROW_NUMBER()が利用できない場合、それを書くための他の方法があります。また、UPDATEの構文も異なる場合があります。あなたの質問には常にタグをつけたり、DBMSのオプションについて言及してください。

2

ここには、スペースを含む名前を設定し、投稿に記載されているIDごとに2つの名前のバリエーションがあるという前提に基づいたソリューションがあります。何のDBMSが

をタグ付けされていないとして、それはまた、私はあなたがのコピーでこれをテスト示唆あなたがスペースなしで名前を使用したい場合は、WHERE

UPDATE your_table 
SET  your_table.Name = a.Name 
FROM (
      SELECT DISTINCT 
        ID, 
        Name 
      FROM your_table 
     ) a 
WHERE CHARINDEX(' ', a.Name) > 0 AND 
     your_table.ID = a.ID 

=0>0を変更するMS SQL Serverのを前提としていあなたのテーブル

1

あなたはデータを更新することができますが、より良いアプローチはデータベースが修正されているように見えますので、名前はIDと共に1回のみ有効です。その後、トランザクションテーブルから名前を削除し、その名前のエンティティに再び参加する必要があります。実用的ではないかもしれないが、非正規化されたデータを修正するよりも正しいことを認識している。

関連する問題