使用FIFO动态CTE的MySQL中的复杂子查询

时间:2018-09-14 05:30:38

标签: mysql django database django-queryset rdbms

我有3张桌子,

第一张表: (购买)

date (mm-dd)    quantity   p_id
    05-05          3         1
    05-06          2         1

第二张表: (销售)

date (mm-dd)    quantity   p_id
    05-07          1         1

第三张表: (已过期)

date (mm-dd)    quantity   p_id
    05-08          4         1

现在我想要的是获取过期时间为以下产品的详细信息:

  • 购买过期产品后(FIFO)
  • 首先购买的产品,将首先过期/出售。

输出应为:

purchase_date      expired_date      quantity    p_id
  05-05               05-08             2         1
  05-06               05-08             2         1

说明

  • 商店中5共有05-06个产品,其中p_id1
  • 然后以05-07 1的数量出售了p_id1,即 根据{strong> FIFO
  • 首先出售了05-05上收到的商品

所以我们现在拥有的产品是:(仅用于可视化)

date (mm-dd)    quantity   p_id
    05-05          2         1   -its 1 quantity is sold
    05-06          2         1

然后在05-08到期,过期的产品为:( by FIFO

purchase_date      expired_date      quantity   p_id
  05-05               05-08             2         1
  05-06               05-08             2         1

2的{​​{1}}产品已经过期,05-05的{​​{1}}产品已经过期

现在我要实现的逻辑是:

所有追加的交易

2

将所有交易追加为:(如上所示)
05-06date (mm-dd) quantity p_id expired 05-05 3 1 False 05-06 2 1 False 05-07 -1 1 False 05-08 -4 1 True 的数量设置为负数,并将sell变量expiry设置为仅在其到期交易时

算法:(使用双端队列推送弹出概念,到期时将其记录)

  1. 对于每组expired个交易:
  2. 初始化True(空)
  3. 每笔交易(所有附加交易)
  4. 如果数量为正,则输入双端队列
  5. 其他流行音乐,
  6. 如果没有弹出窗口跳过(因为出售可以超过购买)
  7. 否则,如果过期为假,即为卖出交易,
  8. 流行音乐,直到卖出和流行音乐之差大于等于零
  9. 否则,这是浪费条目
  10. pop,直到差异大于零为止,并记录每个pop 与众不同

*当差异大于等于0表示购买数量多于出售数量时我停止,因为出售数量为负,请考虑:

p_id

实际上,目前我的工作方式是将所有数据从deque加载到熊猫bought = 2 sold = -4 diff = 2-4 = -2 therefore we need to loop for next purchase until diff >= 0 中,然后应用一些东西,显然这是不可维护的,我想在数据库中完成本身是针对数据库进行了优化的,所以我想做一个复杂的RDBMS dataframe,做一些MySQL才能得到期望的结果。

出售时,我会进行其他操作,因此我希望在那段时间达到最小负载。

基本上发生了什么:

  • 商店购买产品,已创建购买条目,
  • 商店出售产品,进行销售输入,
  • 商店告知此产品已过期,请输入有效期

*它们之间没有关系。

我还使用query来获取数据,所以如果可以使用它,那将是很大的帮助!

我也愿意进行更改或使用完全不同的工具来实现这一目标。

0 个答案:

没有答案