2017-03-29 2 views
0
ID1 ID2  DATE  INITIAL FINAL 
20 328 2016/11/08 01   01 
21 328 2016/11/11 01   01 
53 766 2016/09/26 00   01 
39 766 2016/11/25 01   00

Es gibt zwei Einträge für jeden ID2Auswahl aus der Tabelle, wenn zwei Felder die OR-Bedingung erfüllen. Und wenn sie erfüllen UND-Bedingung auf denselben Feldern wählen die, die mit frühem Zeitpunkt

Im obigen Beispiel mag ich Datensätze auszuwählen mit INITIAL = 01 oder FINAL = 01 sondern auch, wenn initial = 01 und fINAL = 01 für gleiche ID2, ich das mit früher

ich suche nach einem letzten Satz auswählen möchten, die

ID1 ID2  DATE  INITIAL FINAL 
20 328 2016/11/08 01   01 
53 766 2016/09/26 00   01 
39 766 2016/11/25 01   00
sieht wie folgt aus

Antwort

0

in diesem Beispiel 'OR' enthält 'UND'

versuchen es

select * from (select * from myTable where INITIAL = '01' or FINAL = '01' order by Date) where Rownum=1 
+0

, das nicht funktioniert wählen wollten in Oracle – fleetmack

+0

Ich habe Code oben für Orakel geändert – Vecchiasignora

0

Ihre 2 Fälle wie separate Abfragen dann union sie behandeln. Das WITH ist nur ich Dummy-Daten zu bauen. Dies wird nicht den Fall einer id2 mit 01 initial und 01 final adressieren, und eine andere Zeile mit 00 und 01 --- aber das war nicht in Ihren Anforderungen. Noch wird es das Problem ansprechen, wenn Sie zwei 01 01 Zeilen für die gleiche ID2 mit dem gleichen Mindestdatum haben, aber wieder - das war nicht in der Spezifikation; Ich wollte nur sagen, dass diese Dinge gründlich sind.

with records as 
    (select 20 as id1, 328 as id2, to_date('2016-11-08','YYYY-MM-DD') as mydate, '01' as myinitial, '01' as myfinal from dual 
    union all 
    select 21 as id1, 328 as id2, to_date('2016-11-11','YYYY-MM-DD') as mydate, '01' as myinitial, '01' as myfinal from dual 
    union all 
    select 53 as id1, 766 as id2, to_date('2016-09-26','YYYY-MM-DD') as mydate, '00' as myinitial, '01' as myfinal from dual 
    union all 
    select 39 as id1, 766 as id2, to_date('2016-11-25','YYYY-MM-DD') as mydate, '01' as myinitial, '00' as myfinal from dual) 

select * 
from records 
where (myinitial = '01' or myfinal = '01') 
    and myinitial <> myfinal 

union 

select * 
    from records r 
    where r.myinitial = '01' and r.myfinal = '01' 
    and r.mydate = 
     (select min(r2.mydate) from records r2 
      where r2.myinitial='01' and r2.myfinal='01' and r2.id2 = r.id2) 
    ; 
0

Versuchen Sie mit unten Abfrage. Es verwirft Zeile, in der zu Beginn = 00 und FINAL = 00, da Sie nur Datensätze mit INITIAL = 01 oder FINAL = 01 UND ERSTEN = 01 UND SCHLUSS = 01 mit frühem Zeitpunkt

SELECT ID1,ID2,DATE,INITIAL,FINAL FROM TEST1 WHERE ID1 NOT IN(SELECT ID1 FROM 
(SELECT ID1, 
    ID2, 
    DATE, 
    INITIAL, 
    FINAL, 
    RANK() OVER (PARTITION BY ID2 ORDER BY DATE) rn 
FROM TEST1 
WHERE (INITIAL = '01' 
AND FINAL = '01') 
) WHERE rn>1 ) AND (INITIAL != '00'OR FINAL!= '00'); 
Verwandte Themen