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

Aus diesen Aufzeichnungen möchte ich nur unter Datensätze, Ist es möglich?So entfernen Sie aufeinanderfolgende doppelte Datensätze aus der Datentabelle?

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

wobei 'ID tat = 3'/'C' kommen von? und woher kamen 'ID = 4/A' und' ID = 9/C'? –

+0

Wenn Sie Linq verwenden, um mit Ihrer Datenbank zu interagieren, sollten Sie .Distinct() immer dann verwenden können, wenn Sie die Spalte Name verwenden und die Duplikate auf diese Weise entfernen. – Xariez

Antwort

0

Es sieht so aus, als ob Sie nach dem Entfernen von zusammenhängenden Werten fragen.

Wenn wir davon ausgehen, dass die ID Werte als kontinuierlich steigend ohne Lücken behandelt werden, kann es ziemlich einfach getan werden - machen Sie einfach einen Link zu sich selbst und fordern Sie, dass die vorherige Zeile einen anderen Wert hat, oder die vorherige Zeile nicht vorhanden (die erste Zeile enthalten):

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 

Es ist schwieriger, wenn wir tun nicht davon ausgehen, die ID Werte zusammenhängend sein müssen; Hier verwende ich die ROW_NUMBER() Funktion zu simulieren:

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 

Es kann viel bessere Möglichkeiten sein.

In diesen beide, ich verwende:

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'); 

die Ihre erwartete Ausgabe zu passen scheint (aber nicht Ihren erklärten Eingang)

Verwandte Themen