当前位置: 首页 > java >正文

怎样用 esProc 实现连续区间的差集运算

某数据库有两个表,原库存表 data_add 存储了多个物品的多批库存,每批库存有一个起始编号 START_NUM 和一个终止编号 END_NUM,表示区间范围。

IDITEM_IDSTART_NUMEND_NUM
1337101400
2337500800
33378011200
433715001600
53371500016000
63372000030000
74442030

消耗表 data_cons 存储了多个物品的多批消耗,每批消耗同样是个区间范围。

IDITEM_IDSTART_NUMEND_NUM
1337240300
2337301400
33378501100
433715001510
53371500016000

现在要计算出每个物品的现库存,即原库存的多段区间和消耗的多段区间的差集,结果用多段区间来表示。原库存的区间可能被消耗成不连续的多段区间,这种情况下要自然生成多条记录,每条记录对应一个区间,比如原库存的区间 [500:1200] 被消耗成了 2 个区间 [500:849] 和[1101:1200]。

ITEM_IDSTART_NUMEND_NUM
337101239
337500849
33711011200
33715111600
3372000030000
4442030

SQL无法用变量表示集合,不方便进行集合的集合之间的运算,代码非常繁琐。SPL 可以用变量代表集合,容易表达各类集合运算:Try DEMO

 AB
1$select * from data_add.txt$select * from data_cons.txt
2=A1.group(ITEM_ID;~.conj(to(START_NUM,END_NUM)):a)=B1.group(ITEM_ID;~.conj(to(START_NUM,END_NUM)):b)
3=A2.join(ITEM_ID,B2,b)
4=A3.derive([a, b].merge@d().group@i(~!=~[-1]+1):diff)
5=A4.news(diff; ITEM_ID, ~1:START_NUM, ~.m(-1):END_NUM)

A1-B1:加载数据。

A2:用 group 函数对原库存按物品分类,但不汇总,将组内的每个区间转为一个连续序列的小集合,再合并为一个大集合。~ 表示当前组,函数 to 可按起止序号生成连续序列。

Picture1png


B2:对消耗表进行相同的处理。

Picture2png


A3=A2.join(ITEM_ID,B2,b):用 join 函数按物品编号进行左关联。

Picture3png


A4=A3.derive([a, b].merge@d()…..)。新增计算列,先将每个物品的原库存集合和消耗集合进行差集计算。函数 merge 对有序集合进行归并,@d 表示计算差集。注意差集后的序列不连续,比如 849、1101。

Picture4png

group@i(~!=~[-1]+1)。再对每个差集进行条件分组,将连续的序列分到同一小组,比如 849、1101 分别分到了第 2 和第 3 组。函数 group 用于分组,默认按等值分组,@i 表示按条件分组,~[-1] 表示上一个成员。

Picture5png

A5=A4.news(diff; ITEM_ID, ~1:START_NUM, ~.m(-1):END_NUM)。用 A4 的每条记录的 diff 字段里的每个序列,生成一条新记录,其中,新区间的起止序号取自每个序列的头尾。函数 news 可将集合的每个成员扩展成一条记录。~.m(-1) 表示 ~ 里的倒数第 1 个成员,~.m(1) 表示正数第 1 个成员,简写做 ~1。

Picture6png

esProcSPL是开源免费的,点在下载试用~ 

http://www.xdnf.cn/news/6509.html

相关文章:

  • 2023年河南CCPC->F题
  • 从零实现一个高并发内存池 - 3
  • 数字孪生技术于航天航空领域的应用探索
  • LocalDateTime类型的时间在前端页面不显示或者修改数据时因为LocalDateTime导致无法修改,解决方案
  • 远程实时控制安卓模拟器技术scrcpy
  • Linux云计算训练营笔记day09(MySQL数据库)
  • 多系统环境下,如何构建高效的主数据管理体系?
  • Vue2在子组件上使用v-model实现数据的双向绑定、.sync修饰符
  • 图深度学习、EMD和VMD详解
  • 受控组件和非受控组件的适用场景分别是什么?
  • AMGX里“One-ring“和“Two-ring“概念和解释
  • Ubuntu操作合集
  • 典型的**N+1查询问题**
  • 使用CMake中的configure_file命令自动生成项目版本信息
  • 【好用的工具】连服务器进入base指令
  • X-Ray,XRD,XRF,XPS有什么区别?
  • 【文件上传漏洞】
  • 面试从微前端拓展到iframe是如何通信的
  • 初始化一个Springboot项目
  • 基于正点原子探索者开发板的简易音乐播放器
  • doris节点数量规划
  • 设计并应用一个IIR-ButterWorth-Filter的例子
  • 前端工程化
  • MySQL如何查看某个表所占空间大小?(表空间大小查看方法)
  • C#自定义控件-实现了一个支持平移、缩放、双击重置的图像显示控件
  • AMC8 -- 2009年真题解析(中文解析)
  • RHCA笔记
  • 高效电脑隐私信息清理实用工具
  • AIStarter使用技巧|如何通过日志判断项目启动完成?倒计时设置与脚本优化方法详解
  • 计量——检验与代理变量