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 条评论
登录 后参与评论

相关文章

来自专栏Android群英传

程序员英语口语等级考试

17640
来自专栏工科狗和生物喵

【我的漫漫跨考路】数据结构之堆栈的线性实现

正文之前 ? 昨天晚上阶段性的完成了一部分数学的复习(一元积分学终于搞定了,后面的貌似没这么难了),所以今天打算撸一撸代码,结合前几天写的链表实现线性存储,今天...

29660
来自专栏java一日一条

Java常见异常及解释

常见 Java 异常解释:(译者注:非技术角度分析。阅读有风险,理解需谨慎:))

17920
来自专栏智慧教育

比起WE大会“救命的AI”,这个AI已经悄悄进入人们的学习中

“未来人工智能要进一步发展的话,就需从脑科学得到启发,包括机器学习过程,怎么从脑启发的这个概念来设计新的计算模式,新的类似人脑的神经元结构的器件、芯片,甚至是机...

36540
来自专栏Python小屋

使用Python对图像进行中值滤波

首先解答上一篇文章Python使用标准库subprocess调用外部程序中的问题,该题答案为['1', '2', '3', '4'],在正则表达式中,问号(?)...

2.1K110
来自专栏数据小魔方

这么牛X的包,一般人我不告诉他!!!

本文将给大家介绍一个ggplot2灰常牛X的可视化扩展包,我将该包主页的包用法介绍整理成中文,分享给大家。 包名叫geofacet,有经验的charter大概...

35350
来自专栏数据科学与人工智能

【陆勤践行】Python和数据科学的起步指南

Python拥有着极其丰富且稳定的数据科学工具环境。遗憾的是,对不了解的人来说这个环境犹如丛林一般(cue snake joke)。在这篇文章中,我会一步一步指...

263100
来自专栏非典型技术宅

iOS传感器:利用磁力计完成一个AR场景应用1. 磁力计的介绍2. 磁力计的使用3. 开始我们的小案例

20240
来自专栏牛客网

看了这么多大佬的面经,想来应该回馈一波

22000
来自专栏Python与爬虫

[资源分享]计算机科学速成课

推荐 程序员的你一定要看,不是程序员的也可以看看,我已经安利刚中考完的我妹妹看了(培养程序媛...)

26430

扫码关注云+社区

领取腾讯云代金券