2017-06-21 51 views
1
ID Name 
1 A 
2 B 
3 A 
5 A 
6 A 
7 B 
10 B 

これらの記録から、私は記録の下にしか望みません、それは可能ですか?データテーブルから連続した重複レコードを削除するにはどうすればよいですか?

ID Name 
1 A 
2 B 
3 C 
4 A 
7 B 
9 C 
10 B 
+4

から?どこから 'ID = 4/A'と' ID = 9/C'が出ましたか? –

+0

データベースと対話するためにLinqを使用している場合は、名前列を使用し、そのように複製を '取り除く'ときはいつでも、.Distinct()を使用できるはずです。 – Xariez

答えて

0

連続した(順序付きと見なされた)値を削除するよう求めているようです。

値が連続して増加するとみなされると仮定すると、それはかなり簡単に行うことができます。自分自身に戻って左の結合を行い、前の行が異なる値を持つことを要求するか、 (最初の行を含めるために)存在しません:

select cur.ID, cur.[Name] 
from @data cur 
left outer join @data prev on prev.[ID] = cur.[ID] - 1 
where prev.ID is null or prev.[Name] <> cur.[Name] 
order by cur.ID 

我々はID値が連続している必要負いません場合、それはトリッキーです。ここで私はそれをシミュレートするためにROW_NUMBER()関数を使用しています:

select cur.ID, cur.[Name] 
from (select ID, [Name], Row = ROW_NUMBER() over (order by ID) from @data) cur 
left outer join (select ID, [Name], Row = ROW_NUMBER() over (order by ID) from @data) prev 
    on prev.[Row] = cur.[Row] - 1 
where prev.ID is null or prev.[Name] <> cur.[Name] 
order by cur.ID 

もっと良い方法があります。

これらの両方で

、私が使用している:

declare @data table (ID int not null, [Name] char(1) not null); 
insert @data (ID, [Name]) values (1,'A'),(2,'B'),(3,'C'),(4,'A'),(5,'A'), 
    (6,'A'),(7,'B'),(8,'B'),(9,'C'),(10,'B'); 

をあなたの予想出力(ではなく、あなたの規定の入力)を一致させるように思われた `ID = 3`/'C'が来たの

関連する問題