2012-05-11 17 views
10

Ich fragte mich, ob ich irgendeine Hilfe mit dem folgenden Problem bekommen könnte.Postgresql auswählen, bis bestimmte Gesamtmenge erreicht ist

Ich habe eine Tabelle von Transaktionen (unten vereinfacht) und ich möchte nur Transaktionen auswählen, bis mein Betrag insgesamt einen bestimmten Betrag erreicht.

Transactions Tisch

id | date | amount 
----|----------|-------- 
1 | 1/1/2012 | 2 
2 | 2/1/2012 | 3 
3 | 3/1/2012 | 4 
4 | 4/1/2012 | 20 
5 | 5/1/2012 | 1 
6 | 6/1/2012 | 2 

Nun sage ich wählen auf dem Tisch machen wollen, bis die Menge insgesamt 6 heißt nur die ersten 2 Zeilen, wie würde ich das tun?

Ich dachte an vielleicht eine Verbindung mit sich selbst und etwas Summe, aber nicht wirklich überall. Ich würde es vorziehen, wenn keine Funktionen zu verwenden, wenn möglich.

Auch alles ähnliche für minimale Menge.

Jede Hilfe wäre sehr geschätzt :)

T

Antwort

12
select id, 
     date, 
     amount, 
     running_total 
from (
    select id, 
      date, 
      amount, 
      sum(amount) over (order by date asc) as running_total 
    from transactions 
) t 
where running_total <= 6 
+0

Beschlossen, dies zu verwenden. DANKE :) – user913059

+0

Denke es könnte ein kleines Problem damit sein. Wenn ich die neue Transaktionstabelle oben mit einem running_total <= 15 versuche, bekomme ich immernoch nur die Trans-ID 1,2,3 und nicht 5,6. Irgendwelche Hilfe dabei? – user913059

+0

meine aktuelle Lösung ist (Reihenfolge nach Betrag asc, Datum asc) – user913059

1
select T1.* 
from Transactions as T1 
where 6 - (select sum(T2.amount) 
       from Transactions as T2 where T2.id <= T1.id 
     ) >= 0 
order by id asc 

Diese Abfrage auf SQL Server funktioniert, wenn Postgres Unterabfragen wie SQL Server unterstützt, dass es Ihnen

+0

@amount_to_rich ist kein Ausdruck ist nur ein paramameter durch die Menge zu reichen ersetzt werden, herausgegeben ich mein post it –

+0

versuchen, bevor ich sagte, dass es auf Sqlserver funktioniert ich bin nicht sicher, dass es auf Postgre funktioniert –

+0

Ohne den Parameter sollte es nur gut auf PostgreSQL laufen –

1

helfen kann zwar Es ist vielleicht nicht der effizienteste Weg (da Sie im Prinzip immer noch alles auswählen), würde ich mir eine laufende Summe ansehen.

Etwas wie:

SELECT 
    * 
FROM 
    (
    SELECT 
    id 
    , date 
    , amount 
    , (SELECT SUM(amount) FROM Transactions WHERE id <= t.id) AS RunningTotal 
    FROM 
    Transactions t 
) t1 
WHERE 
    t1.RunningTotal < 6 
+0

Sie gehen davon aus, dass sich die IDs in der gleichen Reihenfolge wie das Datum befinden, das nicht unbedingt der Fall sein muss. –

+0

Ja, wenn das Datum ein Problem ist, müsste es in der Unterabfrage eine Reihenfolge geben, aber das wird im Anfangspost nicht erwähnt (es sei denn, es ist nur impliziert - wie es sinnvoll wäre!). – phillyd

+0

Danke für die Hilfe :) – user913059

Verwandte Themen