2017-02-10 7 views
1

Ich bin neugierig auf das Schreiben einer SQL-Abfrage in Oracle auf der Grundlage der vorherigen Zeile in einer Liste zurückgegebener Zeilen. Grundsätzlich muss ich unsere Datenbank nach allen Zeilen abfragen, die eine ID-Nummer von 2460 haben, aber die vorherige Zeile (nach Datum sortiert) hat eine ID-Nummer von 2463. Gibt es eine Möglichkeit, dies zu tun?Oracle SQL: Auswahl basierend auf Wert in vorherigen Zeilen Spalten

Sorry, wenn das verwirrend oder eine dumme Frage ist, bin ich sehr neu und nicht wirklich gut in dieser Art von Dingen. Ich werde gerne alles klarstellen, was geklärt werden muss.

Danke!

Edit:

Hier ist die Abfrage, die ich laufen werde, basierend auf Gordon Antwort zusammen mit einem Screenshot der Ergebnisse, die ich gegen die Ergebnisse bekomme ich bin zu wollen.

select * 
from (select activitytranledger.*, lag(reasontype) over (order by trandate) as prev_reason from activitytranledger) activitytranledger 
where trandate between to_date('02/7/2017','MM/DD/YYYY') 
and to_date('02/8/2017','MM/DD/YYYY') 
and reasontype = 2460 
and prev_reason = 2463 
order by trandate 
; 

Ich nehme dann die Position # und Abfrage für den bestimmten Tag.

select * 
from activitytranledger 
where location = 5777 
and trandate between to_date('02/7/2017','MM/DD/YYYY') 
and to_date('02/8/2017','MM/DD/YYYY') 
order by trandate 
; 

Mit dem "Transid" kann ich die spezifische Zeile finden, die von der ersten Abfrage ausgegeben wurde. Es scheint mir jedoch nicht die gewünschten Ergebnisse zu geben.

Wanted results (Beachten Sie, wie die Reihe direkt über der Zeile mit einem „Reasontype“ von 2460 einen Grund Art von 2463 hat) zu

Current results (Die Reihe I hervorgehoben sollte die 2463 in der Spalte habe ich hingewiesen habe)

Edit 2: eingeschaltet 2463 und 2460

+1

Bearbeiten Sie Ihre Frage und liefern Sie Beispieldaten und gewünschte Ergebnisse. –

Antwort

2

Diese Interpretation Ihrer Frage. Verwenden Sie lag() und eine Unterabfrage:

select t.* 
from (select t.*, lag(id) over (order by date) as prev_id 
     from t 
    ) t 
where id = 2463 and prev_id = 2460; 
+1

@AdamNeighbors - um es weiter zu erklären, wäre es einfacher, wenn Sie 'lag() ...' direkt in der 'where' Klausel verwenden könnten; leider kannst du nicht. Die Unterabfrage ist unvermeidlich. In Ihrer Formulierung wählen Sie jedoch nicht aus einer Tabelle - Sie wählen aus einer "Liste der zurückgegebenen Zeilen". Wo diese Liste erstellt wird, ist es möglich, dass Sie die "lag" -Funktion direkt dort hinzufügen und eine Schicht verschachtelter Unterabfragen entfernen können. (Aber ob Sie das tun können oder nicht hängt davon ab, was die Abfrage tut.) – mathguy

+0

@GordonLinoff Ich habe ein paar Änderungen vorgenommen, um es ein wenig klarer zu machen. –

0

Also, es stellt sich heraus, ich bin ein Idiot. @ GordonLinoffs Lösung funktionierte perfekt Ich habe einfach vergessen, die Position # zu der Abfrage hinzuzufügen, die unten ist, ist die letzte Abfrage, die ich gefunden habe. Ich kann die Position # durch meine Variable ersetzen und kann sie jetzt in meine Schleife einfügen, und das funktioniert wie ein Zauber. Danke, alles was dazu beigetragen hat!

select * 
from (select activitytranledger.*, lag(reasontype) over (order by trandate) as 
prev_reason from activitytranledger) activitytranledger 
where trandate between to_date('02/7/2017','MM/DD/YYYY') 
and to_date('02/8/2017','MM/DD/YYYY') 
and location = 5777 
and reasontype = 2460 
and prev_reason = 2463 
order by trandate 
; 
Verwandte Themen