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

合并有重叠的时间区间的极简方法

某库表有多个账户,每个账户有多个时间区间,区间之间有重叠。

account_idstart_dateend_date
A2019-06-202019-06-29
A2019-06-252019-07-25
A2019-07-202019-08-26
A2019-12-252020-01-25
A2021-04-272021-07-27
A2021-06-252021-07-14
A2021-07-102021-08-14
A2021-09-102021-11-12
B2019-07-132020-07-14
B2019-06-252019-08-26

现在要合并每个账户里重叠的时间区间,生成新的区间,新区间不重叠。

account_idstart_dateend_date
A2019-06-202019-08-26
A2019-12-252020-01-25
A2021-04-272021-08-14
A2021-09-102021-11-12
B2019-06-252020-07-14

SQL 分组后必须立刻汇总,不方便生成时间序列,不方便进行序列间的集合计算,间接实现的代码很复杂。SPL 可以保留分组子集继续计算,提供了生成时间序列的函数、序列间集合计算的函数:Try DEMO

 A
1$select * from data.txt
2=A1.group(account_id)
3

=A2.(~.(periods(start_date,end_date)).merge@u().group@i(~!=~[-1]+1)

.new(A2.account_id,~1:start_date,~.m(-1):end_date))

4=A3.conj()

A1:加载数据。

A2:按账户分组,但不汇总,每组是一个集合。

Picture1png


A3=A2.(~.(periods(start_date,end_date))…) 处理 A2 中的每组数据:先循环当前组的每条记录,根据起止日期生成序列,结果是个序列的集合。~ 表示当前组,函数 periods 可生成时间序列。下图是第一组的第一条记录生成的序列:

Picture2png


…merge@u() 继续处理:对序列的集合求并集,生成一个不重叠的日期序列。函数 merge 用于有序数据归并,@u 表示归并时求并集。下图是第一组求并集的结果,可以看到前 2 条记录重叠的日期已经合并。

Picture3png

...group@i(~!=~[-1]+1)继续处理:对有序的日期序列分组,当当前成员不等于上一个成员 +1 天时新分一组,也就是将日期连续的日期分到同一组。选项 @i 表示对有序数据进行条件分组,[-1] 表示上一个成员。对第一组有序分组后,生成了四个小组,下图是前两个小组,可以看到小组之间日期不连续。

Picture4png

…new(A2.account_id,~1:start_date,~.m(-1):end_date)最后的处理:用小组生成新二维表,每个小组对应一条记录,account_id 取自 A2 中当前组的第一条记录,完整代码 A2.~(1).account_id,简写做 A2.account_id;start_date 取自当前小组的第一个成员;end_date 取自当前小组的最后一个成员。函数 m 可按位置取成员,~.m(1) 表示第一个成员,简写做 ~(1) 或 ~1,~.m(-1) 表示最后一个成员。下图是第一组生成的二维表。

Picture5png


A4=A3.conj() 合并 A3 中各组的成员。

Picture6png

esProc SPL是开源免费的,点击下载试用~

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

相关文章:

  • 【证书与信任机制​】​​SSL证书类型全解析:DV、OV、EV的区别与应用场景
  • 【C#基础】集合.Any() 与 判断集合的长度有啥区别?
  • atoi函数,sprintf函数,memcmp函数,strchar函数的具体原型,功能,返回值;以及使用方法
  • 现代计算机图形学Games101入门笔记(六)
  • 19、云端工业物联网生态组件 - 工厂能效与预测维护 - /数据与物联网组件/cloud-iiot-factory-analysis
  • 紫外波段太阳光模拟器介绍
  • Python Matplotlib 库【绘图基础库】全面解析
  • 在UI 原型设计中,交互规则有哪些核心要素?
  • 数据统计分析及可视化
  • 开源 Web Shell 工具
  • 万文c++继承
  • 前端表格滑动滚动条太费事,做个浮动滑动插件
  • Java基于SpringBoot的外卖系统小程序【附源码、文档说明】
  • 功能连接计算的科学选择:静息态fMRI中20种指标的全面评估
  • 卓力达红外热成像靶标:革新军事训练与航空检测的关键技术
  • FastAPI系列16:从API文档到TypeScript 前端客户端(SDKs)
  • 3天重庆和成都旅游规划
  • 【PmHub后端篇】PmHub集成 Sentinel+OpenFeign实现网关流量控制与服务降级
  • acwing 4275. Dijkstra序列
  • 二叉树复习(C语言版)
  • 国标GB28181视频平台EasyGBS打造交通道路/停车场/公共场所违章视频监控解决方案
  • keil编译时报错:error:Could not open file .\***\core_cm3.o(最有用的方法没有之一!!!)
  • 代码随想录算法训练营第三十九天(打家劫舍专题) | 198.打家劫舍、213.打家劫舍II、337.打家劫舍III
  • Windows更新暂停七天关键注册表
  • 无人机箱号识别系统结合5G技术的应用实践
  • 数字IC后端零基础入门基础理论(Day2)
  • AD 间距规则与布线规则
  • GaussDB 实例 gsql 连接方式详解
  • 在python中使用Json提取数据
  • [思维模式-38]:看透事物的关系:什么是事物的关系?事物之间的关系的种类?什么是因果关系?如何通过数学的方式表达因果关系?