2012-05-11 14 views
10

Me preguntaba si podría obtener ayuda con el siguiente problema.Postgresql seleccionar hasta que se llegue a cierta cantidad total

Tengo una tabla de transacciones (simplificada a continuación) y solo quiero seleccionar transacciones hasta que el total de mi importe alcance una cierta cantidad.

Transactions mesa

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 

Ahora dicen que yo quiero hacer una selección en la mesa hasta que la cantidad total es 6 es decir sólo las 2 primeras filas, ¿cómo voy a hacer esto?

Estaba pensando en tal vez hacer una unión consigo mismo y una suma, pero realmente no llegar a ninguna parte. Preferiría no usar ninguna función si es posible.

También hay algo similar para la cantidad mínima.

Cualquier ayuda sería muy apreciada :)

T

Respuesta

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

Decidió usar esto. GRACIAS :) – user913059

+0

Creo que podría haber un pequeño problema con esto. Si pruebo la nueva tabla de transacciones anterior con un running_total <= 15, seguiré obteniendo el id de transporte 1,2,3 y no 5,6. ¿Alguna ayuda con eso? – user913059

+0

mi solución actual es (ordenar por cantidad asc, fecha 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 

Esta consulta funciona en SQL Server si Postgres soporta subconsultas como SQL Server que pueden ayudarle a

+0

@amount_to_rich no es una expresión es sólo una paramameter para ser reemplazado por la cantidad de ricos, he editado mi post –

+0

probarlo antes de decir que funciona en sqlserver estoy no estoy seguro de que funcione en postgres –

+0

Sin el parámetro, debería funcionar perfectamente en PostgreSQL –

1

Aunque puede que no sea la forma más eficiente (ya que todavía estás, en esencia, seleccionando todo primero), consideraría usar un total acumulado.

Algo así como:

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

Usted está asumiendo que los identificadores están en el mismo orden que la fecha que podría no ser necesariamente el caso. –

+0

Sí, si la fecha es una preocupación, debería haber un pedido en la subconsulta, pero eso no se menciona en el post inicial (a menos que sea implícito, ¡ya que tendría sentido!). – phillyd

+0

Gracias por la ayuda :) – user913059

Cuestiones relacionadas