2012-05-11 11 views
10

Mi chiedevo se potevo ricevere aiuto con il seguente problema.Seleziona Postgresql fino al raggiungimento di un determinato importo totale

Ho una tabella delle transazioni (semplificata di seguito) e desidero solo selezionare le transazioni finché il mio totale non raggiunge un determinato importo.

Transactions tavolo

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 

Ora dicono che voglio fare una selezione sul tavolo fino a quando l'importo totale è 6 vale a dire solo le prime 2 righe, come farei questo?

Stavo pensando di fare un join con se stesso e un po 'di somme, ma non arrivare da nessuna parte. Preferirei non usare nessuna funzione se possibile.

Anche nulla di simile per un importo minimo.

Qualsiasi aiuto sarebbe molto apprezzato :)

T

risposta

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

Deciso di usare questo. GRAZIE :) – user913059

+0

Pensa che potrebbe esserci un piccolo problema con questo. Se provo la nuova tabella delle transazioni di cui sopra con un running_total <= 15, otterrò comunque solo il trans id 1,2,3 e non 5,6. Qualche aiuto con quello? – user913059

+0

la mia soluzione attuale è (ordine per quantità asc, data 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 

Questa query funziona su SQL Server se Postgres supporta subquery come SQL Server non può aiutare a

+0

@amount_to_rich non è espressione è solo un paramameter per essere sostituito da l'importo da ricchi, i modificato il mio post –

+0

provarlo prima ho detto che funziona su SQLServer io sono non sono sicuro che funzionerà su postgres –

+0

Senza il parametro dovrebbe funzionare bene su PostgreSQL –

1

Anche se potrebbe non essere il modo più efficace (dato che sei ancora, in sostanza, selezionando prima tutto), guarderei usando un totale parziale.

Qualcosa di simile:

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

Si presume che gli ID siano nello stesso ordine della data che potrebbe non essere necessariamente il caso. –

+0

Sì, se la data è una preoccupazione, è necessario che ci sia un ordine nella subquery, ma questo non è menzionato nel post di apertura (a meno che non sia solo implicito - come avrebbe senso!). – phillyd

+0

Grazie per l'aiuto :) – user913059

Problemi correlati