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)
我想要一种方法来限制我的选择,以便按顺序返回所有行,直到返回一行以使所有数量列的总和大于某个值。不需要返回额外的列(因此锁定在可重复读取状态)。
如果您不需要“最佳填充”,您可以使用窗口函数和类似的东西:
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
内部窗口函数以满足您的订购标准。
归档时间: |
|
查看次数: |
2748 次 |
最近记录: |