Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

[Abfrage] Entweder oder, aber nicht beide?

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von hstfs23, 30 April 2013.

  1. hstfs23

    hstfs23 Neuer Benutzer

    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
     
  2. ukulele

    ukulele Datenbank-Guru

    Dich interessiert doch eigentlich nur der niedrigste und der höchste Status bzw. Counter, oder verstehe ich das jetzt falsch?
     
  3. hstfs23

    hstfs23 Neuer Benutzer

    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.
     
  4. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  5. hstfs23

    hstfs23 Neuer Benutzer

    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.
     
  6. ukulele

    ukulele Datenbank-Guru

    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
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden