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

怎样用 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.dtcms.com/a/192180.html

相关文章:

  • 什么是 NB-IoT ?窄带IoT 应用
  • 【SPIN】用Promela验证顺序程序:从断言到SPIN实战(SPIN学习系列--2)
  • 华为Watch的ECG功能技术分析
  • 解决 Ubuntu 22.04 安装后启动卡死问题
  • recvfrom和sendto函数中地址参数的作用
  • C++算法(22):二维数组参数传递,从内存模型到高效实践
  • 原生微信小程序 textarea组件placeholder无法换行的问题解决办法
  • postgresql主从+repmgr+keepalive安装
  • 如何在 IntelliJ IDEA 中配置并调用虚拟机 HDFS
  • uniapp微信小程序一键授权登录
  • AI数字人融合VR全景:开启未来营销与交互新篇章
  • 无人机动力系统全解析:核心组件、工作原理与实用指南
  • shell脚本练习(6):备份MySQL数据库表
  • MH22D3开发高级UI应用,适配arm2d驱动
  • 高效管理多后端服务:Nginx 配置与实践指南
  • 兼顾长、短视频任务的无人机具身理解!AirVista-II:面向动态场景语义理解的无人机具身智能体系统
  • ssh快速连接服务器终端配置
  • pyenv简单的Python版本管理器(macOS版)
  • HarmonyOs开发之———UIAbility进阶
  • #跟着若城学鸿蒙# web篇-初探
  • 关于NLP自然语言处理的简单总结
  • AgenticSeek开源的完全本地的 Manus AI。无需 API,享受一个自主代理,它可以思考、浏览 Web 和编码,只需支付电费。
  • PyTorch中.item()函数:提取单元素张量值
  • 自用Vscode 配置c++ debug环境
  • OpenCV图像旋转原理及示例
  • Ubuntu Linux bash的相关默认配置文件内容 .profile .bashrc, /etc/profile, /etc/bash.bashrc等
  • pytorch中各种乘法操作
  • OpenCV CUDA模块中逐元素操作------数学函数
  • HDMI信号采集器连OBS没有声音的问题
  • 盒带自编教材《软件工程》目录