【问题标题】:Postgresql select until certain total amount is reachedPostgresql 选择直到达到一定的总量
【发布时间】:2012-05-19 22:19:36
【问题描述】:

我想知道是否可以就以下问题获得任何帮助。

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

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 行,我该怎么做?

我在考虑可能与自身和一些总和进行连接,但没有真正得到任何地方。如果可能的话,我宁愿不使用任何功能。

还有任何类似的最低金额。

任何帮助将不胜感激:)

T

【问题讨论】:

    标签: sql postgresql select


    【解决方案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 不是一个表达式,只是一个被富人数量替换的参数,我编辑了我的帖子
    • 在我说它可以在 sqlserver 上运行之前尝试一下,我不确定它是否可以在 postgres 上运行
    • 没有参数它应该在 PostgreSQL 上运行得很好
    【解决方案2】:

    虽然它可能不是最有效的方式(本质上你仍然是先选择所有内容),但我会考虑使用运行总计。

    类似:

    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 与日期的顺序相同,但不一定如此。
    • 是的,如果日期是一个问题,则需要在子查询中进行排序,但这在开头的帖子中没有提到(除非它只是暗示 - 因为它是有道理的! )。
    【解决方案3】:
    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
    

    【讨论】:

    • 决定使用这个。谢谢:)
    • 认为这可能有点问题。如果我用 running_total
    • 我目前的解决方案是(按金额升序,日期升序)
    • @a_horse_with_no_name 你能告诉我如何改变这个 SQL 以获得大于 8 的idrunning_total 的列表。所以对于给定的transactions 表示例我需要得到最少的行,总和会给我的金额 > 8,按日期排序(它需要返回 id 的 1、2、3,因为它们总共会返回 9)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    • 1970-01-01
    • 2020-05-31
    • 2019-03-16
    • 2012-10-21
    • 2023-04-01
    • 2023-02-09
    相关资源
    最近更新 更多