2017-10-24 2 views
1

Ich habe eine Funktion, die mir Reihen geordnet gibt (die Funktion bereits um durch die Ergebnisse):Aufzeichnung wählen Sie aus gefilterten Ergebnisse in postgreSQL

Dadurch: select * from func1(ID)

Beispiel A:

rownum date qty 
1  1.1.10 -5 
2  1.10.10 6 
3  2.10.10 6 
4  5.10.10 -2 
5  6.10.10 -8 

Beispiel B:

rownum date qty 
1  1.1.10 -7 
2  1.10.10 6 

Hinweis: rownum ist eine Spalte, die ich in meiner Funktion manuell berechne. Es ist genau auf meine Bedürfnisse abgestimmt. Es ist also in Ordnung, darauf zu basieren.

Ich möchte eine Abfrage, die über die Zeilen von unten passieren schreiben (höchste rownum bis niedrigsten rownum) nach oben und date der ersten angetroffen Zeile zurückzugeben, die eine der zurück negativen qty

Zum Beispiel hat Wert 6.10.10 (rownum 5 die erste Reihe mit negativem Wert von Menge ist) beispiel B 1.1.10 (rownum 2 ist die erste Zeile mit der Menge negativem Wert)

Wie kann ich das?

+0

zum Beispiel BI denken Sie bedeuten 'rownum 1 ist die erste Zeile' –

+0

@JuanCarlosOropeza es nicht gibt es viele Spalten ich nur die notwendigen Daten zeigten ... die Die Reihenfolge der Zeilen richtet sich nach meinen Bedürfnissen, und Sie können Ihre Antwort darauf stützen, dass Sie davon ausgehen, dass das rownum in der richtigen Reihenfolge ist. – avi

Antwort

1

Sie könnten verwenden ROW_NUMBER:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (ORDER BY rownum DESC) as rn 
    FROM func1(ID) 
    WHERE qty < 0 
) 
SELECT * 
FROM cte 
WHERE rn = 1; 
1

Ich glaube nicht, dass Tabellenfunktionen in Postgres die Reihenfolge der Ergebnisse garantieren. Sie müssen einen order by oder einen anderen Mechanismus verwenden.

Wenn Sie das jüngste Datum mit einem negativen Wert wollen:

select max(date) 
from func1(ID) t 
where qty < 0; 

Wenn Sie eine andere Ordnung im Sinn haben:

select date 
from func1(ID) t 
where qty < 0 
order by rownum desc -- your order by conditions here, but inverted 
fetch first 1 row only; 

Diese Sie andere Werte aus der Reihe holen können, wenn du möchtest.

+0

Aber Ihre erste Abfrage ist perfekt, wenn rownum auf Datum basiert. –

+0

Was ist der Unterschied zwischen 'fetch first 1 row only;' und 'limit 1' ?? –

+0

Das rownum berechnet sich nach meiner Funktion es ist nicht zufällig berechnet .. ihre Bestellung ist genau und richtig auf meine Bedürfnisse – avi

Verwandte Themen