首页 文章 精选 留言 我的

精选列表

搜索[AI科研],共10000篇文章
优秀的个人博客,低调大师

合并有重叠的时间区间--AI解法

## 问题描述 一张表记录了多个账户的时间区间,每个账户有多条记录,区间之间可能存在重叠。 **源数据**: ![](https://developer.qcloudimg.com/http-save/yehe-9292056/565c0cb7577ff484be06b9f4ee3022fb.png) **期望结果**(合并每个账户内所有重叠的区间): ![](https://developer.qcloudimg.com/http-save/yehe-9292056/159e24346052cd4c1e1090763d458153.png) 以账户 A 为例: - 前三个区间(6/20~6/29、6/25~7/25、7/20~8/26)互相重叠,合并为 6/20~8/26; - 12/25~1/25 独立; - 4/27~7/27、6/25~7/14、7/10~8/14 重叠,合并为 4/27~8/14; - 9/10~11/12 独立。 B 同理,两个区间重叠合并。 ## SQLazy 分步实现 核心思路:**判断当前区间的开始日期是否大于前面所有区间的最大结束日期**。如果大于,说明当前区间与之前所有区间都不重叠,需要新开一组;否则合并到当前组。 ![](https://developer.qcloudimg.com/http-save/yehe-9292056/a2c599842a154e4b8bf410d6093a44fc.png) **第 1 步:按账户和开始日期排序** *sort account_id, start_date* 将数据按 account_id 和 start_date 升序排列,确保每个账户内的区间按时间顺序处理。 ![](https://developer.qcloudimg.com/http-save/yehe-9292056/d703466f1912ab074e939b8db4e86adc.png) **第 2 步:计算当前行之前所有行的最大结束日期** *compute end_date[:-1] max as prev_max; partition account_id* 在每个账户分区内,计算**从第一行到当前行的前一行**中 end_date 的最大值,记为 prev_max。 ![](https://developer.qcloudimg.com/http-save/yehe-9292056/a502edc0f30e69f3e68a1c5da38fcc56.png) **第 3 步:按条件分段,生成组号** *segment condition start_date > prev_max as gid; partition account_id* 依次检查每行:如果 start_date > prev_max,说明当前区间与之前所有区间不重叠,则新开一组(gid+1);否则归入同一组。 ![](https://developer.qcloudimg.com/http-save/yehe-9292056/39543f01db0cd3a6df57c7722aa167a8.png) **第 4 步:按账户和组号汇总** *summarize start_date min as start_date, end_date max as end_date; group account_id, gid* 对每组取最早的开始日期和最晚的结束日期,得到合并后的区间。 ![](https://developer.qcloudimg.com/http-save/yehe-9292056/84e5c25f819e817aacd0d751ea56fb86.png) 最后删除辅助列 gid。 **编译生成 SQL** 确认上述 4 步逻辑后,SQLazy 编译器自动生成原生 SQL(以 MySQL 为例): ``` WITH t2 AS ( SELECT account_id, start_date, end_date, MAX(end_date) OVER ( PARTITION BY account_id ORDER BY CASE WHEN account_id IS NULL THEN 1 ELSE 0 END, account_id ASC, CASE WHEN start_date IS NULL THEN 1 ELSE 0 END, start_date ASC ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING ) AS prev_max FROM acc ), t3 AS ( SELECT account_id, start_date, end_date, prev_max, 1 + SUM( CASE WHEN start_date > prev_max THEN 1 ELSE 0 END ) OVER ( PARTITION BY account_id ORDER BY CASE WHEN account_id IS NULL THEN 1 ELSE 0 END, account_id ASC, CASE WHEN start_date IS NULL THEN 1 ELSE 0 END, start_date ASC ) AS gid FROM t2 ) SELECT account_id, MIN(start_date) AS start_date, MAX(end_date) AS end_date FROM t3 GROUP BY account_id, gid ORDER BY account_id, start_date; ``` 你不需要读懂或调试这段 SQL,只需确认前面 4 步的逻辑正确,编译器就会输出可运行的代码。 **为什么这很重要** ![](https://developer.qcloudimg.com/http-save/yehe-9292056/b8ca8b37867914f7efef7a14b347b43d.png) SQLazy 让你**用业务语言描述逻辑,而不是用 SQL 语法写嵌套查询**。这个“合并重叠区间”的例子只用 4 步就表达清楚了——排序、计算前面最大结束日期、按条件分段、汇总。编译器帮你生成最终的 SQL,你只需要验证每一步的业务含义是否正确。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册