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

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

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

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是开源免费的,点击下载试用~

相关文章:

  • [原创](现代Delphi 12指南):[macOS 64bit App开发]: 获取macOS App的Bundle路径信息.
  • RK3588 串行解串板,支持8路GMSL相机
  • 应用示例1:交通灯
  • [思维模式-38]:看透事物的关系:什么是事物的关系?事物之间的关系的种类?什么是因果关系?如何通过数学的方式表达因果关系?
  • postman 用法 LTS
  • Go语言空白导入的作用与用途
  • 深度解析 Sora:从技术原理到多场景实战的 AI 视频生成指南【附学习资料包下载】
  • uniapp设置 overflow:auto;右边不显示滚动条的问题
  • CMakeLists生成调用静态动态库可执行demo
  • Linux复习笔记(五) 网络服务配置(dhcp)
  • MetaHipMer2:从头组装宏基因组
  • 基于地图的数据可视化:解锁地理数据的真正价值
  • 正则表达式r前缀使用指南
  • 【原创】使用阿里云存放一个临时共享的文件
  • 《AI大模型应知应会100篇》第61篇:FastAPI搭建大模型API服务
  • OpenCV实现数字水印的相关函数和示例代码
  • 解读RTOS 第七篇 · 驱动框架与中间件集成
  • HTML:入门
  • 刘强东 “猪猪侠” 营销:重构创始人IP的符号革命|创客匠人热点评述
  • 三种常见接口测试工具(Apipost、Apifox、Postman)
  • 美国务院批准向土耳其出售导弹及相关部件,价值3.04亿美元
  • 杭勇已任常州市政协党组成员,此前任常州市委常委、秘书长
  • 黄仕忠丨戏曲文献研究之回顾与展望
  • 加拿大新政府宣誓就职
  • 受贿3501万余元,中石油原董事长王宜林一审被判13年
  • 再获殊荣!IP SH跻身上海文化品牌全球传播力TOP 6