2009-07-23 3 views
2

ある列に同じ値を持つ重複と見なされるレコードを削除し、最新のものとみなされるレコードを保持したい以下の私の例ではInsertedDateにあります。私は、カーソルを使用しないで、設定されているソリューションが欲しいです。目標:すべての重複を削除し、最新のものを維持する。列の同じ値に基づいて重複と見なされ、最新のものを保持するレコードを削除する

以下のddlはいくつかの重複を作成します。削除する必要があるレコードは、John1 & John2です。これは、John3と同じIDを持ち、John3が最新のレコードであるためです。

また、ID = 3の新しいレコード(John6)があるため、John5を削除する必要があります。

Create table dbo.TestTable (ID int, InsertedDate DateTime, Name varchar(50)) 

Insert into dbo.TestTable Select 1, '07/01/2009', 'John1' 
Insert into dbo.TestTable Select 1, '07/02/2009', 'John2' 
Insert into dbo.TestTable Select 1, '07/03/2009', 'John3' 
Insert into dbo.TestTable Select 2, '07/03/2009', 'John4' 
Insert into dbo.TestTable Select 3, '07/05/2009', 'John5' 
Insert into dbo.TestTable Select 3, '07/06/2009', 'John6' 

答えて

2

これは動作します:あなたがタイで対処しなければならない場合

delete t 
from TestTable t 
left join 
(
    select id, InsertedDate = max(InsertedDate) from TestTable 
    group by id 
) as sub on sub.id = t.id and sub.InsertedDate = t.InsertedDate 
where sub.id is null 

が、それはほんの少しトリッキー取得します。

+0

ありがとうございました。私は私の場合には結びつきません。 SQL Serverの新しい機能にはまだ精通していないので、私はあなたの答えを選びました。 –

4

ただ学術的な運動として:

with cte as (
    select *, row_number() over (partition by ID order by InsertedDate desc) as rn 
    from TestTable) 
delete from cte 
where rn <> 1; 

時間の大半は、サムによって提案されたソリューションは、はるかに良い行います。

+1

私はそれがネクタイを扱うときにこの解決法を好んでいます。これは、ネクタイの場合に何を保持するかについてヒントがある場合は、ORDER BYである程度制御できます。 –

関連する問題