【发布时间】:2017-02-20 14:24:38
【问题描述】:
我有一个数据集,我必须在其中合并两个特定字段的范围。在研究过程中,我看到这个问题被称为“岛屿和差距”。不幸的是,大多数 IAG 都涉及在单个列(“StartDate”)或其他内容中合并。而在我的问题中,我有两列构成一个范围(PlzVon-PlzBis)。
我找到了很多例子,但它们往往都是关于给猫剥皮的。其中一些使用 CTE,另一些使用 LAG/LEAD,这是我迄今为止从未听说过的。
我尝试重新利用我找到的一个脚本,主要是因为我能理解它在说什么,但没有骰子。我可以看到问题的所有“部分”(找到上/下端点,匹配两条记录),但我不知道如何用它形成一个连贯的陈述。
在上面的照片中,我想组合突出显示的行,使它们分别是 PlzVon-73000 和 PlzBis-74999。我可以说我需要一个 CTE 或一个相关的子查询,并且具有 b.PlzVon = a.PlzBis + 1 的 ON 条件。但是单个连接是不够的,因为新记录可以与另一个连接,带领我们走上递归和游标的糟糕道路。
任何有关如何合并这些岛屿的帮助将不胜感激。
【问题讨论】:
-
这两个突出显示的行有什么独特之处,可以用来确定这两行是否要合并为一行? PlzVon-38000 的第一行是什么导致它被排除在与其他两行组合之外?
-
您使用什么版本的 SQL Server?请添加相应的标签。
-
看起来不像
gaps-and-islands问题。看看 Itzik Ben-Gan 的 Packing Intervals。如果您在问题和您的预期结果中以文本或INSERT语句(不是图像)的形式提供一些示例数据,那么很有可能有人会编写有效的查询。 -
@VladimirBaranov 这是 2014 版,我已经按照您的要求添加了标签。
-
@JohnH ID_FI 和 ID_PE 字段用于标识它们指向的“实体”。我应该将其添加到我的问题中。
标签: tsql subquery sql-server-2014 gaps-and-islands