Frage

Ich habe eine Oracle-Datenbank, wo ich versuche, ein user Feld aus der frühesten Zeile auszuwählen (basierend auf einem time Feld), wenn bestimmte Voraussetzungen erfüllt sind, und ich weiß nicht, wie es zu tun. Hier ist der Kern meiner Abfrage:

SELECT id,
       CASE WHEN value = 'xyz'
            THEN 'Pending'
            ELSE 'Not Pending'
       END AS status,
       time
FROM table1
INNER JOIN ...
WHERE subject IN (...) AND
      field = 'Status'

Mein Problem ist, ich weiß nicht, wie user auswählen und nur den Wert aus der Zeile mit der frühesten time Wert Anpassung der WHERE-Bedingungen erhalten. Ich glaube nicht, dass ich HAVING verwenden kann, da ich keine Aggregatfunktionen in meinem SELECT zu tun. Die ‚früheste time Wert‘ Bedingung Bedürfnisse anwenden nur , um die Auswahl des user Feld, also ich will id und value für zu wählende alle Werte des time Feld.

Ich dachte, ich die SELECT-Anweisung halten könnte ich oben und dann JOIN mit anderen SELECT-Anweisung, die die bestimmte user bekommt ich will.

SELECT id, status, time, user
FROM (
       ...query above...
     ),
     (
       SELECT user
       FROM table1
       WHERE subject in (...) AND
             field = 'Status' AND
             ROWNUM = 1
       ORDER BY time ASC
     )

Dies ist jedoch wird nur einen Wert für user Gesamt, und es soll ein separater user Wert für jede id in meiner ersten Abfrage ausgewählt werden. Wie kann ich meine SELECT user Abfrage durch die andere Abfrage id Feld begrenzen? Ist dies auch der richtige Ansatz zu bekommen, was ich will?

War es hilfreich?

Lösung

SELECT  id,
        CASE WHEN value = 'xyz'
             THEN 'Pending'
             ELSE 'Not Pending'
        END AS status,
        time,
        FIRST_VALUE(user) OVER (PARTITION BY id ORDER BY time) AS first_user
FROM    table1
INNER JOIN
        ...
WHERE   subject IN (...) AND
        field = 'Status'
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top