Nur ein weiterer Weg, um Ihr Problem zu lösen (ohne Verwendung von Distinct oder Gruppe von) durch eine Identität Spalte und die SQL Analytics-Funktion LAG, um Werte aus der vorherigen Zeile abzurufen. So funktioniert das nicht für SQL Server-Versionen unter 2012.
Leistung: Ich weiß nicht, ob das schneller sein wird. Wenn Sie den Datenfluss, die Tabellen-in/upd-Frequenzen und das Verwendungsmuster beschreiben können, können wir vielleicht andere (bessere) Alternativen messen und vergleichen und vielleicht sogar kommen.
Annahmen: Col2 + Col3 = Einmalig in Output Datentabelle. Die ID-Spalte kann in eine Identity-Spalte (oder eine PK-Spalte) in der Quellentabelle (= @Temp_Tbl unten) konvertiert werden. Und die Uniq_ID Spalte in der Ausgabe nicht über Seriell-zu-sein (wenn ja, dann nur ein kleines zwicken auf der Select Anw notwendig ist)
So funktioniert es: Der dervied Abfrageblock X erhält die vorherigen Werte für Col2 und Col3 basierend auf der Reihenfolge von Col2 und Col3, um 2 abgeleitete Spalten Col2_Prev und Col3_Prev zu erhalten. Dann verwenden wir diese Spalten, um die Duplikate zu eliminieren, indem wir sie in der where-Klausel verwenden.
DECLARE @Temp_Tbl TABLE (ID INT IDENTITY(1,1) , Col1 VARCHAR(5), Col2 VARCHAR(5),Col3 VARCHAR(5))
INSERT INTO @Temp_Tbl (Col1 , Col2, Col3) VALUES
('A','A2','B3') ,
('B','A2','B3') ,
('C','A22','B33') ,
('D','A22','B33') ,
('E','A222','B333') ,
('F','A222','B333') ,
('B1','A2','B3')
SELECT
X.ID as Uniq_ID
,X.Col1
,X.Col2
,X.Col3
-- ,X.Col2_Prev -- Uncomment For Troubleshooting
-- ,X.Col3_Prev -- Uncomment For Troubleshooting
FROM
(
SELECT A.* ,
Lag(A.Col2, 1, 0) OVER (ORDER BY A.Col2,A.Col3) as Col2_Prev , -- Get Value for Col2 from Previous Row
Lag(A.Col3, 1, 0) OVER (ORDER BY A.Col2,A.Col3) as Col3_Prev -- Get Value for Col3 from Previous Row
From @Temp_Tbl A
) X
WHERE X.Col2 <> X.Col2_Prev AND
X.Col3 <> X.Col3_Prev
Ergebnis:
Uniq_ID Col1 Col2 Col3
1 A A2 B3
3 C A22 B33
5 E A222 B333
habe meine Antwort die Arbeit für Sie tun? –
Vielen Dank. Scheint gut zu funktionieren, nachdem die Zählung (*)> 1 hinzugefügt wurde. Ich frage mich, ob es möglich ist, dies ohne Gruppe zu tun, um die Leistung zu verbessern? Diese SQL wird über eine Million Zeilen laufen. – Achilles