PostgreSQL查询直到达到特定总金额

14

我希望能够得到关于以下问题的帮助。

我有一个交易表格(如下所示),我只想选择直到我的金额总数达到一定金额的交易。

交易 表格

 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,即只需要前两行,我该怎么做?

我想可能需要自己与自己进行连接,并进行一些求和操作,但没有得到任何进展。如果可能的话,我更愿意不使用任何函数。

还有类似于最小金额的问题。

非常感谢您的帮助 :)

T

3个回答

22
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

决定使用这个。谢谢 :) - user913059
这个可能有点问题。 如果我尝试使用running_total<=15的新交易表,我仍然只会得到trans id 1,2,3而不是5,6。 有什么帮助吗? - user913059
我的目前解决方案是按照金额升序、日期升序排序。 - user913059
@a_horse_with_no_name,您能否展示一下如何修改这个SQL语句以获取idrunning_total列表,使它们的总和大于8。例如,对于给定的transactions表,我需要获取最少的行,使它们的总和大于8,并按日期排序(它需要返回id为1、2、3的行,因为它们的总和为9)。 - alex23

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

如果Postgres支持像SQL Server一样的子查询,那么这个查询可以在SQL Server上运行,这将会有所帮助。


@amount_to_rich不是一个表达式,只是一个要替换为“致富金额”的参数,我已经编辑了我的帖子。 - anouar.bagari
在我说它适用于SQL Server之前,请先尝试一下,我不确定它是否适用于PostgreSQL。 - anouar.bagari
没有参数的情况下,它应该可以在PostgreSQL上正常运行。 - user330315

1

虽然这可能不是最有效的方法(因为您仍然本质上是首先选择所有内容),但我会考虑使用累计总数。

类似于:

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

你假设ID与日期的顺序是相同的,但这并不一定是正确的。 - user330315
是的,如果日期是一个问题,子查询中需要有一个order by,但这在开篇帖子中没有提到(除非它只是暗示 - 因为这是有意义的!)。 - phillyd

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