2012-05-11 7 views
1

フィールドid、invid、vendorid、cost、timestamp、chdeletedを持つテーブルcosthistoryがあります。ベンダーが価格リストを更新するたびにトリガーが入力されたようです。冗長SQL価格コストレコードを削除する

最後のレコード以降に価格が変更されているかどうかに関係なく、冗長レコードが設定されています。
例:彼らは最後の価格更新以来の変更を反映していないので、

id | invid | vendorid | cost | timestamp | chdeleted 
1 | 123 | 1 | 100 | 1/1/01 | 0 
2 | 123 | 1 | 100 | 1/2/01 | 0 
3 | 123 | 1 | 100 | 1/3/01 | 0 
4 | 123 | 1 | 500 | 1/4/01 | 0 
5 | 123 | 1 | 500 | 1/5/01 | 0 
6 | 123 | 1 | 100 | 1/6/01 | 0 

私はID 2,3,5でレコードを削除したいと思います。

私はそれがいくつかの手順を踏むかもしれませんが、それができると確信しています。 この表は100GBに膨れ上がっており、600Mの行を含んでいます。私は、適切なクリーンアップがこのテーブルのサイズを90%〜95%削減すると確信しています。

ありがとうございます!

+0

...あなたの質問は何ですか? – devarc

+0

あなたはどのデータベースを使用していますか? – RedFilter

答えて

3

あなたのアプローチは、使用しているデータベースによって異なります。 SQL Serverの2005+のために、次のクエリは、あなたが削除したいレコードを与える必要があります。

select id 
from (
    select id, Rank() over (Partition BY invid, vendorid, cost order by timestamp) as Rank 
    from costhistory 
) tmp 
where Rank > 1 

あなたは、このようにそれらを削除することができます。私はあなたが使用してテーブルを再作成することを示唆している

delete from costhistory 
where id in (
    select id 
    from (
     select id, Rank() over (Partition BY invid, vendorid, cost order by timestamp) as Rank 
     from costhistory 
    ) tmp 
) 
0

をクエリごとのグループ。また、私は "id"列が他のテーブルで使用されていないと仮定します。その場合は、これらのテーブルも修正する必要があります。

このような大量のレコードを削除するには、長い時間がかかる可能性があります。

クエリは次のようになります。

insert into newversionoftable(invid, vendorid, cost, timestamp, chdeleted) 
    select invid, vendorid, cost, timestamp, chdeleted 
    from table 
    group by invid, vendorid, cost, timestamp, chdeleted 

あなたが削除を選ぶならば、私は希望の提案:。

(1)ので、何の重複がに行くされていない、最初のコードを修正し ( 2)重複IDを特定し、別のテーブルに配置します。 (3)バッチで削除してください。

ようなものを使用し、重複したIDを検索するには:あなたの代わりに最新バージョンを保持したい場合は、ORDER BY句で「タイムスタンプDESC」を使用

select * 
    from (select id, 
       row_number() over (partition by invid, vendorid, cost, timestamp, chdeleted order by timestamp) as seqnum 
      from table 
     ) t 
    where seqnum > 1 

関連する問題