2017-02-20 3 views
-1

Tabelle wählen: CODES_TABLEOrakel mulitple Aufzeichnungen zu 1 auf Bedingungen

Serial - Code - DateTime 
A123  B2   01/01/17:14:00 
A124  B2   01/01/17:14:00 
A123  B3   01/01/17:14:05 
A123  B4   01/01/17:14:08 
A124  B3   01/01/17:14:00 
A128  B2   03/01/17:14:00 
A129  B2   03/01/17:14:00 
A129  B4   02/01/17:14:00 

Was Im Versuch, eine Liste aller Serials zu erhalten ist, die einen Code B2 erzeugt haben, B3 und B4 und hat es in einer bestimmten Reihenfolge erzeugt - dh B2 zuerst, dann B3 dann B4 So In diesem Beispiel - nur Serien-A123

+0

Mit dieser Tabelle Daten, was ist das erwartete Ergebnis? – jarlh

+0

Hallo, Danke für die schnelle Antwort ... Ich erwarte Serial A123 im obigen Beispiel ... Bis jetzt habe ich es versucht: Wähle * aus Codes_Tabelle wo ((Code = 'B2') ODER ('Code =' B3 ') ODER (Code = 'B4')), aber ich kann mich nicht wirklich darum kümmern, wie man dann überprüft, ob sie in einer Datumsreihenfolge vorkommen ... –

+0

Bitte [bearbeiten] Sie Ihre Frage, um [was Sie bisher versucht haben] (http : //whathaveyoutried.com). Sie sollten eine [mcve] des Codes einbeziehen, mit dem Sie Probleme haben, dann können wir versuchen, mit dem spezifischen Problem zu helfen. Sie sollten auch [fragen] lesen. –

Antwort

1

Unter der Annahme, von Eingabedaten, dass jeder code nur einmal für eine serial occure kann, könnte dies ein Weg sein:

/* test case */ 
with testTable(Serial,Code, DateTime) as (
    select 'A123', 'B2', to_date('01/01/17:14:00', 'dd/mm/yy:hh24:mi') from dual union all 
    select 'A124', 'B2', to_date('01/01/17:14:00', 'dd/mm/yy:hh24:mi') from dual union all 
    select 'A123', 'B3', to_date('01/01/17:14:05', 'dd/mm/yy:hh24:mi') from dual union all 
    select 'A123', 'B4', to_date('01/01/17:14:08', 'dd/mm/yy:hh24:mi') from dual union all 
    select 'A124', 'B3', to_date('01/01/17:14:00', 'dd/mm/yy:hh24:mi') from dual union all 
    select 'A128', 'B2', to_date('03/01/17:14:00', 'dd/mm/yy:hh24:mi') from dual union all 
    select 'A129', 'B2', to_date('03/01/17:14:00', 'dd/mm/yy:hh24:mi') from dual union all 
    select 'A129', 'B4', to_date('02/01/17:14:00', 'dd/mm/yy:hh24:mi') from dual 
) 
/* the query */ 
select serial 
from testTable 
group by serial 
having listagg(case when code in ('B2', 'B3', 'B4') then code end) within group (order by dateTime) like '%B2B3B4%' 

Die Idee hier ist, durch serial zu aggregieren, das für jede serial eine Schnur bildet, die die codes enthält, geordnet durch dateTime.

Unter der Annahme, dass jeder code nur einmal für eine serial die einzige serials erscheinen können, die Ihre Bedingung entsprechen Strings 'B2B3B4' enthalten haben.

Die CASE wird verwendet, um den Fall zu behandeln, den Sie überprüfen müssen, ob eine Seriennummer B2, B3, B5 hat, wo sogar B4 auftreten kann.

Dies sollte besser erklären, wie das funktionieren soll:

select serial, listagg(case when code in ('B2', 'B3', 'B4') then code end) within group (order by dateTime) as string 
from testTable 
group by serial; 

SERI STRING 
---- --------------- 
A123 B2B3B4 
A124 B2B3 
A128 B2 
A129 B4B2 
+0

Danke Aleksej, also die Codes (B2 und B3) können mehrfach vorkommen - aber Code B4 wird immer nur einmal vorkommen - solange ein B2 und ein B3 davor aufgetreten ist - dann will ich das sehen ... –

+0

Das Wichtige hier ist, dass Sie für eine einzelne Serie nicht mehr als eine "B2", "B3" oder "B4" haben; wenn sie auf verschiedenen Serien vorkommen, kein Problem – Aleksej

+0

Sie sind ein Star! –

Verwandte Themen