由于您没有指定您的 RDBMS,我将假设它是 Postgresql ;-)
select *, sum(amount) over() - sum(amount) over(order by amount) as remainder
from tbl;
输出:
| ID | AMOUNT | REMAINDER |
---------------------------
| 3 | 1 | 10 |
| 2 | 2 | 8 |
| 1 | 3 | 5 |
| 4 | 5 | 0 |
工作原理:http://www.sqlfiddle.com/#!1/c446a/5
它也适用于 SQL Server 2012:http://www.sqlfiddle.com/#!6/c446a/1
正在考虑 SQL Server 2008 的解决方案...
顺便说一句,您的 ID 只是一个行号吗?如果是,请执行以下操作:
select
row_number() over(order by amount) as rn
, sum(amount) over() - sum(amount) over(order by amount) as remainder
from tbl
order by rn;
输出:
| RN | REMAINDER |
------------------
| 1 | 10 |
| 2 | 8 |
| 3 | 5 |
| 4 | 0 |
但如果您确实需要完整的 ID 并将最小的数量移到顶部,请执行以下操作:
with a as
(
select *, sum(amount) over() - sum(amount) over(order by amount) as remainder,
row_number() over(order by id) as id_sort,
row_number() over(order by amount) as amount_sort
from tbl
)
select a.id, sort.remainder
from a
join a sort on sort.amount_sort = a.id_sort
order by a.id_sort;
输出:
| ID | REMAINDER |
------------------
| 1 | 10 |
| 2 | 8 |
| 3 | 5 |
| 4 | 0 |
在此处查看查询进度:http://www.sqlfiddle.com/#!6/c446a/11