Ответ 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
Мне было интересно, могу ли я помочь в решении следующей проблемы.
У меня есть таблица транзакций (упрощенная ниже), и я хочу только выбрать транзакции, пока моя сумма не достигнет определенной суммы.
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 строки, как бы я это сделал?
Я думал о том, что, возможно, присоединился бы к себе и какой-то сумме, но на самом деле никуда не денусь. Я бы предпочел не использовать какие-либо функции, если это возможно.
Также ничего похожего на минимальную сумму.
Любая помощь будет высоко оценена:)
Т
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
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, это может помочь вам
Хотя это может быть не самый эффективный способ (поскольку вы по-прежнему, по сути, сначала выбираете все), я бы посмотрел на использование текущей суммы.
Что-то вроде:
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