SQL - 合并重叠数据

2024-04-11

我在 SQL Server 中有一个简单的数据集,如下所示

**ROW    Start    End**
  0     1        2
  1     3        5
  2     4        6
  3     8        9

Graphically, the data would appear like this enter image description here

我想要实现的是折叠重叠数据,以便我的查询返回

**ROW    Start    End**
  0     1        2
  1     3        6
  2     8        9

这在 SQL Server 中是否可行,而无需编写复杂的过程或语句?


这是SQL小提琴 http://www.sqlfiddle.com/#!6/96614/2另一种选择。

首先,所有限制按顺序排序。然后,删除重叠范围内的“重复”限制(因为一个开始后面跟着另一个开始,或者一个结束后面跟着另一个结束)。现在,范围已折叠,开始值和结束值将再次写在同一行中。

with temp_positions as  --Select all limits as a single column along with the start / end flag (s / e)
(
    select startx limit, 's' as pos from t
    union
    select endx, 'e' as pos from t
)
, ordered_positions as --Rank all limits
(
    select limit, pos, RANK() OVER (ORDER BY limit) AS Rank
    from temp_positions
)
, collapsed_positions as --Collapse ranges (select the first limit, if s is preceded or followed by e, and the last limit) and rank limits again
(
    select op1.*, RANK() OVER (ORDER BY op1.Rank) AS New_Rank
    from ordered_positions op1
    inner join ordered_positions op2
    on (op1.Rank = op2.Rank and op1.Rank = 1 and op1.pos = 's')
    or (op2.Rank = op1.Rank-1 and op2.pos = 'e' and op1.pos = 's') 
    or (op2.Rank = op1.Rank+1 and op2.pos = 's' and op1.pos = 'e')
    or (op2.Rank = op1.Rank and op1.pos = 'e' and op1.Rank = (select max(Rank) from ordered_positions))
)
, final_positions as --Now each s is followed by e. So, select s limits and corresponding e limits. Rank ranges
(
    select cp1.limit as cp1_limit, cp2.limit as cp2_limit,  RANK() OVER (ORDER BY cp1.limit) AS Final_Rank
    from collapsed_positions cp1
    inner join collapsed_positions cp2
    on cp1.pos = 's' and cp2.New_Rank = cp1.New_Rank+1
)
--Finally, subtract 1 from Rank to start Range #'s from 0
select fp.Final_Rank-1 seq_no, fp.cp1_limit as starty, fp.cp2_limit as endy
from final_positions fp;

您可以测试每个 CTE 的结果并跟踪进展情况。您可以通过删除以下 CTE 并从前一个 CTE 中进行选择来完成此操作,如下所示。

with temp_positions as  --Select all limits as a single column along with the start / end flag (s / e)
(
    select startx limit, 's' as pos from t
    union
    select endx, 'e' as pos from t
)
, ordered_positions as --Rank all limits
(
    select limit, pos, RANK() OVER (ORDER BY limit) AS Rank
    from temp_positions
)
select *
from ordered_positions;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL - 合并重叠数据 的相关文章

随机推荐

  • 检查 iOS 互联网连接是否缓慢

    我添加了苹果提供的可达性类 它可以很好地检查互联网连接 如果互联网关闭 我的应用程序会显示消息 但如果互联网很慢 它就会继续加载 我正在使用 wi fi 当 iPhone 通知栏中只有一个可见的点表示 wifi 信号时 我遇到了这个问题 所
  • 我如何知道主屏幕是否已对焦?

    我有一个在 Android 上运行的服务 我需要知道是否有任何应用程序处于焦点状态 或者 桌面 主屏幕 是否处于焦点状态 我不知道这个词是否适合指手机的主屏幕 我如何知道这是焦点还是其他应用程序 在服务内部 我有以下代码来获取正在运行的任务
  • 我可以在播种时将我的所有产品更新给特定用户吗?

    如何更新所有产品以为其分配特定用户 admin User create name gt Admin password gt password walmart Store create name gt Walmart address gt S
  • 用于存储过程的 SQL 表和列解析器

    是否有一个应用程序可以解析一组给定的存储过程 SQL Server 2000 并获取其中使用的所有表和关联列 存储过程可以包含来自不同数据库的表 输出应该是这样的 表AU 列A 列B 列S 表 列 列 列 我用Database Editio
  • 从给定的 WSDL 创建 PHP SOAP 服务

    这可能会被认为是一个非常懒惰的问题 但我向你保证事实并非如此 我已经尝试了好几天让它工作但我就是做不到 我已经获得了一个 WSDL 文件 我需要用 PHP 为其创建一个 SOAP 服务 谁能告诉我正确的做法是什么 服务的接收者期望在调用 g
  • socket.io 和express 4 个会话

    我想在我的 socket io 应用程序中访问 express 4 会话 我对 Node 不太熟悉 在实现此功能时遇到了一些麻烦 我找到了一个允许访问express 4会话的npm模块 https www npmjs org package
  • 使用 gldrawpixels 进行 opengl 旋转

    我的团队目前仅限于在 opengl 1 4 平台上绘制图像 这意味着我们无法使用任何漂亮的纹理映射来绘制图像 是的 我们仅限于使用 intel 集成图形平台 这非常烦人 到目前为止 我们能够绘制 缩放和翻转图像 但是制作图形的人声称在使用
  • React 应用程序之间可以通信吗?

    我的项目是三个 React 应用程序的旅程 我想使用从应用程序 1 到应用程序 2 以及从应用程序 2 到应用程序 3 的一些数据 如果要传递的数据很小 我会将其传递到第二个应用程序的 url 中的查询参数中 如果数据很大或私密 我计划将其
  • PHPMailer ,通过电子邮件内容与不同的接收者保持 1 个 SMTP 连接

    phpMailer New PHPMailer phpMailer gt isSMTP phpMailer gt SMTPKeepAlive true for Send your emails right away phpMailer gt
  • 如何使用 Moq 模拟 SoapException 来对错误处理进行单元测试

    我继承了一个小型控制台应用程序 用于调用 SOAP Web 服务 这是一个以各种方式记录异常的嵌套 try catch 的悲剧性混乱 我想围绕抛出 SoapException 时它的行为进行一些测试覆盖 问题 当我无法模拟接口并且无法将属性
  • 如何通过Hibernate获取数据库版本?

    有没有办法通过Hibernate 3 2 API获取底层数据库版本的一些信息 我未能在这里和 javadoc 中找到相关位 获取数据库引擎的版本是特定于实现的 这意味着没有获取版本的共享方法 因此 Hibernate 无法真正提供 API
  • 淡入时的 ScrollTop 引导框模式

    我使用 bootbox js 制作模态 但是当模态淡入并且内容太长时 滚动条会到达底部按钮的级别 当模态出现时 我需要滚动条保持在顶部 我已经解决了添加 off shown bs modal 在 bootbox dialog 之后 boot
  • 使用 webview 显示来自 sdcard 的图像不起作用

    我已经在 sdcard 根目录中下载了 map750 png 文件 但是当我尝试在带有一些文本的 Web 视图中显示它时 只显示文本 你能帮我找出代码中的错误吗 谢谢 setContentView R layout webview mWeb
  • AVPlayer audioSessionGotInterrupted 从后台唤醒时的通知

    我使用 AVAudioPlayer 来播放音频 我启用了背景音频并且音频会话配置正确 我实施了audioSessionGotInterrupted音频会话中断时收到通知的方法 这是我当前的代码 objc private func audio
  • 是否可以从 qt QColumnView 中删除预览小部件?

    我需要在 qt 视图中显示一组分层数据 我正在使用 QColumnView 来显示模型 但是 有一个功能可以使视图中的最后一列被降级为预览小部件 有可能隐藏这一点吗 例如 类似于 view setPreviewWidget NULL 尽管这
  • Python 从动态文件名导入

    我处于以下情况 我有一个 python 脚本main py 根据配置文件运行一些操作 配置文件本身就是一个 python 脚本 类 我希望能够从命令行传递不同的配置文件作为参数并将其导入主脚本中 python 中是否可以动态加载类 如果是这
  • 在运行时将 scala 3 代码从字符串解析为 Scala 3 AST

    我的目标是将 Scala 3 代码作为字符串获取 并在运行时将其解析为 Scala 3 的抽象语法树 在此过程中 如果代码存在编译错误 我应该将其作为某些异常的一部分 更大的目标是如果 scala 代码有效 则最终得到 Expr T 并通过
  • 将包裹的物品居中放置在弹性盒之间的空间中

    对于导航部分 我希望它使用space between理由 对于导航可能需要换行的较小显示器 我希望这些项目能够自行居中 而不是单独排成一行时粘在左侧 nav display flex width 100 flex flow row wrap
  • document.write() 会造成什么损害? [复制]

    这个问题在这里已经有答案了 此刻发生了什么不好的事情document write 被调用 我听说过一些关于document write对 DOM 或 Javascript 库的使用产生不利影响 我面前有一个问题 我怀疑它是相关的 但无法找到
  • SQL - 合并重叠数据

    我在 SQL Server 中有一个简单的数据集 如下所示 ROW Start End 0 1 2 1 3 5 2 4 6 3 8 9 Graphically the data would appear like this 我想要实现的是折