0

重複ファイルを誤ってデータベース テーブル (IBM DB2 v9.7) にロードしてしまいました。有効なデータを削除せずに重複レコードを削除する必要があります。

最初は、HAVING count(*) > 1私の問題の解決策だと思いましたが、これはうまくいきません。当社のサプライヤは、仕様が変更された部品を製造しているため、ファイルは有効なデータで複数回ロードされる可能性があります。

私はいくつかのことを知っています:

  1. 重複レコードの日付範囲: '2012-08-27' から '2012-09-02' の間
  2. データの検証に使用する属性

これは、重複を識別するための私の SQL コードです。

SELECT CAST(ENDDATE AS DATE) ENDDATE,CAST(LOADEDON AS DATE),SUBSTR(SITEID,1,20) SITEID,SUBSTR(LOCATIONNAME_1,1,20),SUBSTR(RID,1,15),COUNT(RID) FROM AUTOMATION WHERE CAST(ENDDATE AS DATE) BETWEEN '2012-08-27' AND '2012-09-02' GROUP BY CAST(ENDDATE AS DATE),CAST(LOADEDON AS DATE),SUBSTR(SITEID,1,20),SUBSTR(LOCATIONNAME_1,1,20),SUBSTR(RID,1,15) ORDER BY 5 ASC FOR FETCH ONLY WITH UR

編集: 重複を指定するために使用できる列のセットは、RID、LOADEDON、および FILENAME です (ここには示されていません)。

これはサンプル出力です

08/29/2012 09/05/2012 JGS Memphis          JGS Memphis          029369751671            518
09/01/2012 09/05/2012 Reynosa              Reynosa              029054883474            521
08/29/2012 09/05/2012 JGS Memphis          JGS Memphis          028881223425            522

正当な理由でN回ロードされたレコードを削除せずに、タイムフレーム「2012-08-27」および「2012-09-02」のすべての重複レコードを削除したい。

注: テーブルには主キーがありません (Rowidたとえば、MS Sqlserver のように)

4

2 に答える 2

2

どの列セットが重複を指定しているかはよくわかりません。以下は、サンプル出力の列であると想定しています。

delete from (select t.*,
                    row_number() over (partition by enddate, loadedon, siteid order by loadedon desc) as seqnum
             from automation t
            ) t
where seqnum > 1

これは、row_number() を使用して連続番号を割り当て、最初の行を除くすべてを削除して、データベースに 1 行が残ることを保証します。

于 2012-09-14T19:57:09.517 に答える
1

他のレコードと完全に同一であるが良いレコードと、他のレコードと完全に同一であるが良くないレコードとを区別する方法がない限り、実際にはそうではありません。それを行う方法はありません。または、質問の何かを見逃しましたか?

于 2012-09-14T19:57:57.653 に答える