Postgresql выберите, пока не будет достигнута определенная общая сумма

Мне было интересно, могу ли я помочь в решении следующей проблемы.

У меня есть таблица транзакций (упрощенная ниже), и я хочу только выбрать транзакции, пока моя сумма не достигнет определенной суммы.

Transactions таблица

 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

Теперь скажите, что я хочу сделать выбор в таблице до тех пор, пока сумма будет равна 6, а только первые 2 строки, как бы я это сделал?

Я думал о том, что, возможно, присоединился бы к себе и какой-то сумме, но на самом деле никуда не денусь. Я бы предпочел не использовать какие-либо функции, если это возможно.

Также ничего похожего на минимальную сумму.

Любая помощь будет высоко оценена:)

Т

Ответ 1

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

Ответ 2

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

Этот запрос работает на SQL Server, если Postgres поддерживает подзапросы, такие как SQL Server, это может помочь вам

Ответ 3

Хотя это может быть не самый эффективный способ (поскольку вы по-прежнему, по сути, сначала выбираете все), я бы посмотрел на использование текущей суммы.

Что-то вроде:

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