2017-01-12 2 views
0

Ich versuche eine Abfrage zu schreiben, die nach einer Zeile (die alles enthalten kann) sucht, die einer Zeile folgt, die etwas Spezifisches enthält.postgresql - Unterabfrage nach zufälliger Instanz nach einer bestimmten Instanz suchen

Ich bin nicht ganz sicher, wie das am besten erreicht wird, meine ersten Gedanken sind, eine Unterabfrage zu schreiben, die die Daten indiziert oder sortiert und irgendwie angibt, welcher Index in die Hauptabfrage ausgegeben werden soll.

Ich wollte ein Bild zur Erläuterung hinzufügen, aber mir wird gesagt, dass ich keine Bilder posten kann. Als Alternative ich einen Link zu einem Bild unterhalb eines Beispiels Daten gebucht haben festgelegt, um zu versuchen und zu zeigen, was ich versuche zu tun (danke an das Moderationsteam für Ihr Verständnis):

https://postimg.org/image/va7n814s9/

Hoffentlich können Sie jetzt das Bild sehen, ich versuche im Grunde, die Unterabfrage zur Ausgabe der grünen Zeile zu bringen.

Logischerweise wird es dies tun, indem es die Tabelle durchsucht, um Instanzen der Warteschlange 42 zu finden (wie in blau hervorgehoben) und die nächste Zeile auszugeben. Wenn es mehrere Instanzen der Warteschlange 42 gibt, möchte ich, dass die Unterabfrage auf die letzte Instanz fokussiert und die vorherigen ignoriert.

Auch FYI Ich werde postgresql über NaviCat verwenden, um die Abfrage auszuführen.

Ich hoffe, ich bin mit meiner Frage oben sinnvoll, wenn Sie irgendeine Erklärung benötigen, lassen Sie es mich wissen. Jede Hilfe würde sehr geschätzt werden.

Antwort

1

Wie wäre es damit?

select a.* 
from actions a 
where a.id > (select max(a2.id) from actions a2 where a2.queue = 42) 
order by a.id 
fetch first 1 row only; 

Dies setzt voraus, dass die Bestellung auf id basiert. Sie können es auch auf die Datumsspalte stützen.

Ein anderes Verfahren verwendet Funktionen Fenster:

select a.* 
from (select a.*, 
      max(case when queue = 42 then id end) over() as max_id42 
     from a 
    ) a 
where id > max_id42 
order by id 
fetch first 1 row only; 

Dies verwendet max() mit einem case. Sie können auch filter in neueren Versionen von Postgres verwenden.

+0

Vielen Dank für die Antwort auf Gordon, leider bekomme ich noch nicht die gewünschten Ergebnisse. Die erste Methode gibt mir null Ergebnisse. Die zweite Methode scheint aus irgendeinem Grund zu hängen, also habe ich sie nach ein paar Minuten getötet. Irgendwelche Zeiger oder alternative Methoden würden sehr geschätzt werden. Danke nochmal! – afropunk

+0

@afropunk. . . Der erste sollte nur 'NULL' zurückgeben, wenn die höchste ID 'queue = 42' hat. Jede Abfrage sollte in der Lage sein, einen Index 'a (Warteschlange, ID)' zu nutzen. –

+0

Danke nochmal Gordon. Ich ging zurück und schaffte es schließlich, Methode 1 zur Arbeit zu bringen. Ich musste einen weiteren ID-Filter hinzufügen, um es zum Laufen zu bringen, aber ich habe die Frage ursprünglich zu stark vereinfacht, so dass Sie das nicht wissen konnten! Ich habe im Wesentlichen Ihre Logik verwendet, also nochmals vielen Dank für Ihre schnellen und hilfreichen Antworten. BTW Ich habe gerade den Blog entdeckt und finde es sehr interessant! Alles Gute. – afropunk

Verwandte Themen