2016-07-22 10 views

Antwort

2

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.

0

Sie ein Paar subselect

select ID, val1, val2 
from my_table 
where (id) in (select min(id) from my_table where (vali1, val2) in 
(select distinct val1,val2 from my_tbale)) 
0
SELECT DISTINCT first_value(ID) over (PARTITION BY val1, val2 ORDER BY ID), val1, val2 FROM your_tbl 

Aber es wird shurely nicht geben Ihnen (8, 2, 2) rudern können, weil val1 und val2 sind die gleichen wie in Zeile (3, 2, 2).

Verwandte Themen