[Abfrage] Entweder oder, aber nicht beide?

hstfs23

Neuer Benutzer
Beiträge
3
Hallo,

ich benötige Hilfe bei einer SQL-Abfrage.

Eine Verarbeitungstabelle enthält zu diversen Objekten unterschiedliche Status mit deren Zeitangaben. In der Regel springt die Verarbeitung über verschiedene Status, sodass ich diese relativ leicht filtern kann und jeweils 2 Zeilen pro Objekt habe, mit denen ich dann die Verarb.-Zeit berechnen kann (und noch einiges mehr; dann in Excel). Nun gibt es aber hin und wieder den Fall, dass Objekte einen "Zwischen"-Status mehrmals durchlaufen, der aber für meine Berechnunen nicht relevant ist. Zusätzlich gibt es noch einen Status-Counter in der Tabelle. Diesen benötige ich auch, da der finale Status in der Tabelle mehrmals und mit unterschiedlichen Zeitangaben versehen ist (er ist sozusagen im entsprechenden System nochmals untergliedert, mich interessiert nur der erste Eintrag). In der Regel ist der vierte Status (Counter auf 3) der, den ich benötige. Wird ein Zwischenstatus zweimal durchlaufen steht der Counter auf 4.

Was mir vorschwebt:
Entweder (Wenn Counter = 3 und Status = xyz)
oder (Wenn Counter = 4 und Status = xyz)

aber eben nicht beides. Weil wenn Counter 3 bei Status xyz zutrifft, dann trifft er auch Counter 4 zu und so würde ich dann wieder 3 Zeilen pro Objekt bekommen.

Gibt es da Möglichkeiten in SQL? Habe schon versucht was zu finden, war aber alles erfolglos.

Vielleicht mal schematisch, was mir als Ausgabe vorschwebt:

Objekt -- Status -- Counter -- Zeit
1 -- A -- 0 -- xya
1 -- D -- 3 -- xyb
2 -- A -- 0 -- xyc
2 -- D -- 4 -- xyd
3 -- A -- 0 -- xye
3 -- D -- 4 -- xyf
 
Werbung:
Dich interessiert doch eigentlich nur der niedrigste und der höchste Status bzw. Counter, oder verstehe ich das jetzt falsch?
 
Naja, nicht ganz. Im Grunde gibt es nach meinem gewünschten Status noch weitere, die das System erzeugt, aber für meine Betrachtung nicht relevant sind - entsprechend geht dann auch der Counter auch (ich glaube in der Regel bis 7 oder 8). Mich interessiert nur der erste (Objekt erzeugt) und der - in der Regel - vierte (Objekt freigegeben). Es kann eben aber vorkommen, dass "Objekt freigegeben" eben an fünfter Stelle steht, da einer der Zwischenschritte hin und wieder zweimal durchlaufen wird. Und das eigentliche Problem daran ist ja nur, dass systemseitig alles, was nach "Objetk freigegeben" kommt, auch mit derselben Statusnummer in der Tabelle abgelegt wird. Ich bin also irgendwie auch auf den Counter angewiesen.

Oder gibt es vielleicht noch eine Möglichkeit auf den jeweils erten Status zu filtern? Sozusagen wenn Status = xyz dann nur die Zeile, in der das zuerste gefunden wird - unabhängig vom Counter.
 
Oder gibt es vielleicht noch eine Möglichkeit auf den jeweils erten Status zu filtern? Sozusagen wenn Status = xyz dann nur die Zeile, in der das zuerste gefunden wird - unabhängig vom Counter.

Zeig doch einfach mal eine kleine Beispieltabelle mit Daten und was rauskommen soll. Für mich klingt es aber mal wieder nach Window-Funktionen, die MySQL nicht bietet. Siehe anderer grad laufende Thread.
 
Auch wenn die Daten sehr abstrakt sind, kann und möchte ich nichts genaueres dazu zeigen.

Ich habe mir jetzt nochmal exemplarisch ein paar Objekte rausgesucht, die Tabelle sieht folgendermaßen aus:

Die Spalten: Objekt-ID, Statuszähler, Datum, Zeit, Status-Code (+ weiteres Zeug, was nicht interessiert)
Pro Objekt (immer gleich ID) habe ich nun 5-6 Zeilen. Die jeweils erste hat im Statuszähler nichts stehen, dann beginnend bei 1 (zählt also bis 4 oder 5). Datum ist i.d.R. pro Objekt gleich, die Zeit differiert zwischen den Status.
Für das erste Objekt habe ich folgende Status-Codes: 1-2-3-4-4, das zweite: 1-2-2-3-4-4 usw. Das Verhältnis ist in etwa gleichverteilt, es kann auch vorkommen, dass Status 4 drei bis viermal vorkommt.

Als Ausgabe hätte ich gerne (da ich hierfür schon ein Excel-Template angelegt habe): je zwei Zeilen pro Objekt mit den Zeiten für Status 1 und 4 (also das erste Mal, dass Status für das jeweilige Objekt auftaucht).
12345 - [NULL] - 01.01.1970 - 15.00.00 - 1
12345 - 4 - 01.01.1970 - 16.00.00 - 4
.
.
.
usw.
 
Werbung:
Mir käme hier sowas in den Sinn:
Code:
SELECT    t1.*
FROM    tabelle t1
WHERE    t1.[Counter] = 4
AND        t1.[Status] = xyz
AND        NOT EXISTS (    SELECT    1
                        FROM    tabelle t2
                        WHERE    t2.objekt = t1.objekt
                        AND        t2.[Counter] = 3
                        AND        t2.[Status] = xyz )
UNION ALL
SELECT    t1.*
FROM    tabelle t1
WHERE    t1.[Counter] = 3
AND        t1.[Status] = xyz
OR        t1.[Counter] = 1
AND        t1.[Status] = xya
 
Zurück
Oben