Thinking in SQL系列之:供需分配问题

编辑手记:SQL做为一种编程语言,能够满足各类数据处理的需要,关键就在于算法与思维方式。以SQL会友,希望结交更多的数据库、数据分析领域的朋友。

推荐阅读:

Thinking in SQL系列之:数据挖掘K均值聚类算法与城市分级

Thinking in SQL系列之数据挖掘C4.5决策树算法

作者简介:牛超

10多年数据库技术积累,长期从事ORACLE数据库管理与开发工作。精通企业级数据库应用设计、SQL、算法实现、异常分析、性能优化。目前就职于日立咨询(中国)有限公司。Mail:10867910@qq.com

供需分配,简单来说就是你有各种需求,我来个性化供应满足。很多问题都可以转化为此类问题,应用很普遍。比如餐桌上摆满各种茶杯,海碗,主人拿出可乐、雪碧、牛奶、啤酒等各种饮料来招待。直到客人喝饱或者饮料喝完都算供需分配完成。

从2006年第一次接触到货需求分配程序,就思考过一个问题,一个SQL能否处理该问题,当时由于对SQL的掌握程度有限,分析结论是不可以,原因是前一次分配会影响后面的处理,所以只能用ROW BY ROW的方式处理了。之后陆续遇到过类似的供需分配问题,都是采用PLSQL或者其它语言实现。

直到前几年在实现一个ERP系统的PO/RCV接收分配功能时,出于对ORACLE SQL掌握的自信程度。重新思考此类问题时,为了消除行与行之间的依赖,头脑风暴过程想到数字电路有个ALU加法器改进设计,即提前进位加法器通过增加额外的门电路,相临位进位无需等待,从而实现了一个脉冲完成8位加法的并行处理

供需分配,也可以采用类似ALU的改进,将ROW BY ROW的处理方式转换为并行处理。通过提前窥探,无需等待前一次的分配结果,而通过统计函数提前算出之前的分配结果。用一个SQL完全可以搞定。

要完成这个提前窥探,有个前提很重要:有序的供应按照既定顺序分配到需求上,即需求与供应都要有序组合。

以到货分配入库为例,根据到货ID(REV_ID)的顺序以库存组织(ORGANIZATION_ID)和物料(ITEM_ID)维度按照货位优先级将到货数量分配到各个货位的空闲区(容量QUANTITY),比如将REV_ID为5的到货,分配到L2货位,分配数量3,

可以简单表示为: {REV_ID,LOC,ALLOC_QTY} = {5,L2,3}

货位表

到货表

为简化代码量,暂不考虑货位会饱和的情况,如果感兴趣可以自己调整,具体SQL实现如下(个人环境ORACLE XE 11.2):

思路很重要,ALLOC_BOUND块用来界定每个REV_ID与货位区间的范围,还有一段投影列 LAST_ALLOC_QTY 的计算,承上启下至关重要。

如果在做大批次供需分配数据处理时,SQL易于优化,还有个好处就是可以指定并行度

可以看到SQL的输出结果如下,可以关注ORGANIZATION_ID、ITEM_ID、PRIORITY、REV_ID、ALLOC_QTY,最后一列即为分配结果值,可以统计一下分配总量,物料501,502分别是4,17,说明供应量(到货)已经完全被分配:

以上这段脚本曾经被个人用来实现ERP PO/RCV接收分配、到货货位分配、MRP计算过程的PR/自由库存匹配分配、财务成本以及AP/AR往来余额帐龄分配报表,可以说,只要存在供需分配的场景,以上SQL应该都能满足。

总之,Thinking in SQL,数据处理,SQL为王。思路很关键,对于ORACLE,PLSQL永远只是SQL的补充,而非替代品,Row by row means slower and slower。

SQL为我们提供了专注于集合处理的条件,提供了各类SQL监控、优化的手段。如果被我们“碎片化”再嵌入到PLSQL或者其他语言,沦为专门取数据的手段,那就有些背“道”而驰了。

原文发布于微信公众号 - 数据和云(OraNews)

原文发表时间:2017-03-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏AhDung

【Xbox one S】开箱&开机&初入坑心得

身为一个资lao深nian单机游戏玩家,常年混迹在PC平台,但内心深处一直对主机有种迷之向往,感觉那才是单机游戏的正处之地,坐沙发上拿着手柄对着电视跌宕起伏才是...

2792
来自专栏Netkiller

如何开发以太坊网页钱包·Express + web3.js 实例

中国广东省深圳市龙华新区民治街道溪山美地 518131 +86 13113668890 <netkiller@msn.com>

76613
来自专栏程序员宝库

程序员的基础生存技能:高效用Google

来源:GavinZhang( @GavinBuildSomething ) guoze.me/2016/06/26/how-to-google/ 如果说近二十年...

27011
来自专栏java一日一条

超级有趣的五个404错误页面设计

曾几何时,当你输入错误链接时,很多网站都会显示幽默的图片或短语来提醒你该网页不存在,但这样的日子已经一去不复返了。在一个新的互联网时代,GIF 就是新的文字,而...

332
来自专栏机器人网

教你DIY一个会打招呼的龟仙人——萌萌哒乌龟机器人

编者注:本项目来自Instructables,项目作者为chombaw。 在本项目中,我将从头开始打造一个能够使用蓝牙进行控制的四足乌龟机器人。该机器人拥有两个...

2698
来自专栏知晓程序

现实生活压力大,不如用这 4 款小程序去二次元世界找「老婆」

纸片人那么好那么可爱,画出来的场景那么美那么酷炫,低等维度像一个梦,梦里什么都有。

905
来自专栏pangguoming

看完此文还不懂NB-IoT,你就过来掐死我吧...

3GPP NB-IoT的标准化始于2015年9月,于2016年7月R13 NB-IoT标准完成。

651
来自专栏CSDN技术头条

Hacker曾经知晓的那些事

笔者想到现在年轻的Hacker们对ASCII表和那些奇怪的控制字符越来越陌生,不禁感慨万千。 这些知识原本是年轻Hacker们初出茅庐的第一课。然而世事变迁无常...

20210
来自专栏腾讯位置服务

WebService | 常见问题

WebService 1.腾讯位置服务可以判断并显示我在 “××博物馆”,“××海洋馆”,“××风景区”内吗? 可以支持。请参阅逆地址解析(位置描述)技术文档...

792
来自专栏编程一生

大话高可用

1032

扫码关注云+社区