2016-05-07 6 views
1
Wiederholung

Ich habe eine SQL-Tabelle mit einigen Daten wie diese, wird es nach dem Datum sortiert:Duplikate aus Abfrage, während

+----------+------+ 
| Date | Col2 | 
+----------+------+ 
| 12:00:01 | a | 
| 12:00:02 | a | 
| 12:00:03 | b | 
| 12:00:04 | b | 
| 12:00:05 | c | 
| 12:00:06 | c | 
| 12:00:07 | a | 
| 12:00:08 | a | 
+----------+------+ 

Also, ich möchte, dass meine select Ergebnis wie folgt sein:

+----------+------+ 
| Date | Col2 | 
+----------+------+ 
| 12:00:01 | a | 
| 12:00:03 | b | 
| 12:00:05 | c | 
| 12:00:07 | a | 
+----------+------+ 

ich habe die distinct Klausel aber es entfernt die letzten beiden Zeilen mit Col2 = 'a'

+1

Was für 'das Ergebnis der Regel hier nicht null ist a'? –

+0

Es ist hilfreich, Datenbankfragen mit der entsprechenden Software (MySQL, Oracle, DB2, ...) und der Version, z. 'sql-server-2014'. Unterschiede in Syntax und Funktionen beeinflussen oft die Antworten. – HABO

+0

Sie benötigen eine Abfrage, die die nächste Zeile in jeder Zeile Treffer überprüfen wird –

Antwort

2

Sie können lag (SQL Server 2012+) verwenden verwendet, um die valu zu erhalten e in der vorherigen Zeile und vergleichen Sie es dann mit dem aktuellen Zeilenwert. Wenn sie gleich sind, weisen Sie sie einer Gruppe (1 hier) und einer anderen Gruppe (0 hier) ansonsten zu. Wählen Sie abschließend die erforderlichen Zeilen aus.

select dt,col2 
from (
select dt,col2, 
case when lag(col2,1,0) over(order by dt) = col2 then 1 else 0 end as somecol 
from t) x 
where somecol=0 
+0

Vielen Dank. –

0

Wenn Sie mit Microsoft SQL Server 2012 oder höher, können Sie dies tun:

select date, col2 
from (
      select date, col2, 
        case when isnull(lag(col2) over (order by date, col2), '') = col2 then 1 else 0 end as ignore 
      from (yourtable) 
     ) x 
where ignore = 0 

Dies sollte funktionieren, solange col2 nicht NULL-Werte enthalten kann, und wenn die leere Zeichenfolge (‚‘) ist kein gültiger Wert für col2. Die Abfrage benötigt etwas Arbeit, wenn eine der Annahmen nicht gültig ist.

0

gleiche wie akzeptierte Antwort (+1) nur die Bedingungen bewegen
übernimmt col2

select dt, col2 
from (select dt, col2 
     lag(col2, 1) over(order by dt) as lagCol2 
     from t 
    ) x 
where x.lagCol2 is null or x.lagCol2 <> x.col2