Sie können ROW_NUMBER
nutzen, Ihnen zu helfen:
SELECT t.ID, t.val1, t.val2 FROM
(SELECT ID, val1, val2, ROW_NUMBER()
OVER (PARTITION BY val1, val2 ORDER BY ID) AS rownumber
FROM table1) t
WHERE t.rownumber = 1
Hier verwende ich eine Unterabfrage, in dem ein eine Zeilennummer für jeden Datensatz erhalten, Aufteilen der Aufzeichnungen von val1
und val2
. Dann verwende ich äußere Abfrage, um nur Zeile zu filtern, die rownumber=1
hat, die die Werte zurückgibt, die Sie benötigen.
UPDATE: Ich habe nicht bemerkt, dass Sie die gleichen Wiederholungs Werte in Ihrem erwartete Ergebnis haben kann (zB IDs 3 und 8 sollten sowohl in den Ergebnissen angezeigt werden), wo meine erste Abfrage-ID 8 nicht umfassen würde
Hier alternative Lösung, die Ergebnisse wie in Ihrem erwarteten Ergebnis gibt:
SELECT
t.ID,
t.val1,
t.val2
FROM (
SELECT
ID,
val1,
val2,
LAG(val1) OVER (ORDER BY ID) as previousVal1,
LAG(val2) OVER (ORDER BY ID) as previousVal2
FROM table1) t
WHERE
(t.previousVal1 IS NULL and t.previousVal2 IS NULL) OR
t.val1 <> t.previousVal1 OR
t.val2 <> t.previousVal2
ORDER BY t.ID
Hier in Unterabfrage verwenden I Funktion LAG
vorherige Werte von val1
und val2
zu bekommen. Dann wähle ich in der äußeren Abfrage einen ersten Datensatz (spezifiziert durch die Bedingung t.previousVal1 IS NULL and t.previousVal2 IS NULL
) und alle Datensätze, in denen sich die Werte val1
und val2
vom vorherigen Datensatz unterscheiden.