缺口和孤岛问题是否有正式的定义?如果是这样,这个问题是否满足它?

Is there a formal definition of Gaps and Islands problems? If so, does this problem satisfy it?

提问人:J. Mini 提问时间:12/4/2021 最后编辑:J. Mini 更新时间:12/7/2021 访问量:238

问:

似乎“间隙和孤岛”这个词在我的工作场所被过度使用。我最近在那个旗帜下基本上遇到了以下问题。

以一组包含许多行的数据为例,每行包含大量数据,但特别是,始终包含开始和停止时间列,并包含许多其他列,如果一个列不是 NULL,则其他列为 NULL。例如:

开始时间 停止时间 醉态 编程能力
01 60 0100
10 20 0450
40 50 0250

(您也可以使用明显的非枢轴等价物,但不要担心)

并将该数据转换为一种形式,其中所有数据都以这样一种方式折叠,这样您只需查看与该时间段相对应的单行,即可在任何给定时间找出真实情况。因此,对于前面的示例,您需要以下方法:

开始时间 停止时间 醉态 编程能力
01 09 0100
10 20 0100 0450
21 39 0100
40 50 0100 0250
51 60 0100

要了解这是否是您真正想要的,请查看原始行中的时间。在时间 10 之前,只给出“Dunkenness=0100”,因此结果中的第一行必须从 01 到 09,并且仅包含醉酒信息。原始表中的下一行从 10 到 20,因此我们在结果中必须有一行表示该时间段,并且它必须包含当时为真的任何信息(即“Drunkenness=0100”始终为真,“Programming Ability = 0450”仅在 10 到 20 次之间为真)。由于“编程能力”在时间 21 到 39 之间未定义,因此我们必须有另一行为 NULL。然后,其他两行由与前几行相同的过程生成,因此我们得到了上面的表格。

这真的是“缺口和孤岛”的问题吗?还是文献给它起了不同的名字?我同意第一个数据集中存在差距,并且最终数据集中的结果被拆分为岛屿,但这似乎不是文献在谈论“差距和岛屿”问题时所指的。文献似乎关心的是寻找差距或寻找岛屿,而不是将差距转化为岛屿并像这样合并数据。

之所以使用 SQL 标记,是因为这是一个关系数据库。我不是在寻求解决方案,我怀疑在您的答案中包含 SQL 解决方案会很有启发性,尽管它们会受到欢迎。因此,我没有在这个问题中包含任何SQL代码。

我不认为这个问题是基于意见的。我已经看到了足够多的关于差距和孤岛问题的报道,相信在某个地方必须对它们有一个正式的定义。强烈建议回答这些问题的正式定义及其来源。如果这不是间隙和孤岛问题,而是实际上是其他问题,那么请给出一个名称和来源定义。

与 SQL 语言无关 的关系数据库 术语 差距和孤岛

评论

0赞 Tim Biegeleisen 12/4/2021
我认为您需要解释我们从输入表到输出的逻辑。从长远来看,这似乎不是缺口和孤岛的问题。
0赞 Tim Biegeleisen 12/4/2021
我仍然不明白,但这看起来不像是缺口和岛屿。
1赞 NickW 12/5/2021
嗨 - 我想知道你为什么关心它叫什么?给它贴上标签有什么好处?此外,仅供参考,没有人会设计这样的表:其中除了一个属性列之外的所有属性列始终为 null(假设属性数量不多)
1赞 J. Mini 12/5/2021
@NickW 有两个好处:1)知道这个名字可以帮助我查找它,2)知道它不是间隙和孤岛,可以节省我按原样对待它而失去的时间。至于表的设计,这是连接的结果,而不是以这种方式设计的东西。
1赞 NickW 12/7/2021
显然只是我的意见,但是,鉴于这个论坛的目的是帮助人们解决问题,描述你面临的问题并寻求帮助解决它,而不是要求人们对其进行分类,这不是更有效率吗?即使有人说这是一个“差距和孤岛”问题,你也无法知道他们是否正确,它也不会让你更接近解决你可能面临的任何问题。事实上,如果他们说这是一个“g&i”问题并且是错误的,那么你将浪费时间寻找不适用的解决方案

答:

2赞 Igor N. 12/7/2021 #1

如果一个不是 NULL,则其他条件是 意味着您的行只是键、值对的不同表示形式。换句话说,它的非枢轴变体将如下所示

钥匙 价值 开始 结束
醉态 100 01 60
编程能力 450 10 20
编程能力 250 40 50

假设它通过了数据完整性检查,即同一键没有不同值的重叠间隔。然后它看起来像一个缓慢变化的 2 型维度,实际上我们可以将 20 到 40(排除)之间的编程能力值缺失解释为 NULL。

但是,也可以将该数据解释为两个单独的表,即按间隔的开始和结束日期合并(通过完全联接)的 Drunkenness 和 Programming Ability。

SELECT coalesce(a.start,b.start) as start, coalesce(a.end,b.end) as end,
a.Value, b.Value 
from a full join b on a.start=b.start and a.end = b.end

因此,例如,b 缺少 (10,60) 的数据,并且在第一行中获得了 NULL 的编程能力。如果您正确地连接这两个表,则可以获得第二个表,以考虑时间间隔重叠。

SELECT greatest(a.start,b.start) as start, least(a.end,b.end) as end,
a.Value, b.Value 
from a full join b on a.start <= b.end and b.start <= a.end

无论哪种方式,这都不完全是差距和岛屿的问题。在这个问题中,数据有一些重叠的间隔,可能有间隙,人们必须确定由不连续性间隙分隔的不重叠的连续性间隔。