PostgreSQL,选择行直到达到并超过特定数量

3

我有一个包含 iddateamount 的表格,我需要获取按日期降序排列的 id 列表,其总和大于或等于某个特定值。

 id |   date   | amount 
----|----------|--------
 1  | 1/1/2017 |   3 
 2  | 2/1/2017 |   5 
 3  | 3/1/2017 |   4
 4  | 4/1/2017 |   2 
 5  | 5/1/2017 |   7 
 6  | 6/1/2017 |   4

例如:
  1. 我需要获取所有行的总和大于或等于12,并按日期倒序排序。那么将会有3行:6、5、4,因为4+7+2=13。
  2. 我需要获取所有行的总和大于或等于5,并按日期倒序排序。那么将会有2行:6、5,因为4+7=11。
  3. 我需要获取所有行的总和大于或等于15,并按日期倒序排序。那么将会有4行:6、5、4、3,因为4+7+2+4=17。
有一个非常相似的问题和解决方案,请参见Postgresql select until certain total amount is reached,但我需要略微不同。 感谢任何帮助。

它与链接的问题有何不同? - Vamsi Prabhala
@vkp,链接的问题获取所有小于给定值的行,我需要更多的行来超过给定值。 - alex23
1个回答

6

只需使用累加求和:

select t.*
from (select t.*, sum(amount) over (order by date desc) as running_amount
      from t
     ) t
where running_amount - amount < 12
order by date desc;

1
应该是 running_amount - amount < 12,这样在运行总额恰好等于 n 行的总和时就不会多出一行。 - Vamsi Prabhala
@vkp 是的,你说得对,使用 < 就不会有额外的行了。非常感谢你们两位的帮助,正是我所需要的。 - alex23

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接