提问者:小点点

在SQL中使用循环或递归还是使用Python?


假设我有下表:

这里A-B-C-D是购物车。我想买推车里的东西。项目的价格在每一行中。例如,购物车A有6个价格(10,9,8,7,6,5)的商品。

我只想在一个给定的推车中购买一个项目,如果在另一个推车中没有更便宜的项目,否则我想从另一个推车中购买该项目。当我购买每件物品时,我会将其标记为已购买。而且每个购物车都有不同的购买能力。对于A,我可以购买的最大值是5,对于B是6,对于C是4,对于D是1。

A车是锚,所以如果A车达到容量,我们就停下来。

所以事情会是这样的。

购买:

  1. 来自A的5个
  2. 6来自A
  3. 本次购买后来自D-D的6达到容量
  4. 7来自A
  5. 8来自A
  6. 来自B的8
  7. 来自B的8
  8. 9从A-A到达容量

既然A达到了它的容量,它就到此为止了。

如何在SQL中执行此操作。我想我可以使用一个循环,但我读过SQL是为了提高效率而基于设置的。我试图做的似乎需要一个循环或递归。这是正确的方法吗?我应该使用Python来完成这件事吗?

谢谢你的帮助!


共1个答案

匿名用户

如果我没有理解错的话,您可以通过取消转轴、枚举行和筛选来非常容易地完成此操作:

select t.*
from (select cart, val,
             row_number() over partition by cart order by val) as seqnum
      from ((select 'A' as cart, A as val from t) union all
            (select 'B' as cart, B from t) union all
            (select 'C' as cart, C from t) union all
            (select 'D' as cart, D from t)
           ) t
     ) t
where (cart = 'A' and seqnum <= 5) or
      (cart = 'A' and seqnum <= 6) or
      (cart = 'A' and seqnum <= 4) or
      (cart = 'A' and seqnum <= 1)
order by val;

注意:根据您正在使用的数据库,可能有更简单的方法来取消透视。