从 T 中选择行,使得 sum(T.quantity) 大于参数

use*_*560 1 postgresql select

TLDR:我需要一种方法来限制我的选择,以便只返回填充新订单所需的行。

嘿,我正在寻找一种更好的方法来查询下面的简化玩具表。现在我做了一个简单的选择,然后在 Python 中做一些额外的逻辑来处理完全或部分可填充的行。

id |name   | category |  price  | quantity
---+-------+----------+---------+---------
1  |Robby  | buy      | 45      | 4
2  |Blane  | buy      | 48      | 5
3  |Shawn  | buy      | 43      | 10
4  |Valva  | sell     | 62      | 9
5  |Chris  | buy      | 42      | 15
Run Code Online (Sandbox Code Playgroud)

如果我以 40 美元的价格插入一个新的卖单,数量 = 12

SELECT id, name, price, category
FROM my_table
WHERE price > 40 AND category = 'buy' 
ORDER BY price DESC;
Run Code Online (Sandbox Code Playgroud)

然后在 Python 中,我的逻辑看起来像这样:

running_total = 0
for order in orders:
    running_total += order.quantity
    fill_order(order, new_sell_order)
    if running_total >= new_sell_order.quantity:  # Values is 12 in my example.
        break
Run Code Online (Sandbox Code Playgroud)

我想要一种方法来限制我的选择,以便按顺序返回所有行,直到返回一行以使所有数量列的总和大于某个值。不需要返回额外的列(因此锁定在可重复读取状态)。

a_h*_*ame 7

如果您不需要“最佳填充”,您可以使用窗口函数和类似的东西:

select *
from (
  select id, name, price, category, 
         sum(price) over (order by price, date_created) as so_far
  from my_table
  where price > 40 
    and category = 'buy' 
) t
where so_far <= 12;
Run Code Online (Sandbox Code Playgroud)

如果您正在混合订单的“组”,您可能还需要一个partition by子句。更改order by内部窗口函数以满足您的订购标准。