差距和孤岛问题是不是有正式定义?如果是这样,这个问题是不是满足它?

Posted

技术标签:

【中文标题】差距和孤岛问题是不是有正式定义?如果是这样,这个问题是不是满足它?【英文标题】:Is there a formal definition of Gaps and Islands problems? If so, does this problem satisfy it?差距和孤岛问题是否有正式定义?如果是这样,这个问题是否满足它? 【发布时间】:2022-01-10 11:43:44 【问题描述】:

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

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

Start Time Stop Time Drunkenness Programming Ability
01 60 0100 NULL
10 20 NULL 0450
40 50 NULL 0250

(您也可以使用明显的未透视等价物,但不要担心)

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

Start Time Stop Time Drunkenness Programming Ability
01 09 0100 NULL
10 20 0100 0450
21 39 0100 NULL
40 50 0100 0250
51 60 0100 NULL

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

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

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

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

【问题讨论】:

我认为你需要解释一下我们从输入表到输出的逻辑。从长远来看,这似乎不是一个空白和孤岛问题。 我还是不明白,但这看起来不像是缝隙和孤岛。 嗨 - 我想知道你为什么关心它叫什么?对它应用标签有什么好处?另外,就像仅供参考一样,没有人会设计这样的表:除了一个属性列之外的所有属性列始终为空(假设属性的数量不小)跨度> @NickW 有两个好处:1) 知道这个名字可以帮助我查找它;2) 知道它不是间隙和孤岛,这样我就可以节省时间,因为我会像对待它一样对待它。是。至于表格设计,这是由于连接而不是那样设计的结果。 显然只是我的看法,但鉴于此论坛的目的是帮助人们解决问题,描述您面临的问题并寻求帮助解决问题不是更有效率吗?而不是要求人们对其进行分类?即使有人确实说它是或不是“差距和孤岛”问题,您也无法知道它们是否正确,并且它使您无法解决您可能遇到的任何问题面对。事实上,如果他们说这是一个“g&i”问题并且是错误的,那么您将浪费时间寻找不适用的解决方案 【参考方案1】:

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

Key Value Start End
Drunkenness 100 01 60
Programming Ability 450 10 20
Programming Ability 250 40 50

假设它通过了数据完整性检查,即同一个键没有不同值的重叠区间。然后它看起来像 type-2 slowly changing dimension,实际上我们可以将 20 到 40(不包括)之间的 Programming Ability 值的缺失解释为 NULL。

但是,也可以将该数据解释为两个单独的表,醉酒和编程能力按间隔的开始日期和结束日期合并(通过完全连接)。

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) 的数据,并且您在第一行中的 Programming Ability 为 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

无论哪种方式,这都不是差距和岛屿问题。在该问题中,数据有一些重叠区间,可能有间隙,并且必须确定由不连续间隙分隔的非重叠连续区间。

【讨论】:

以上是关于差距和孤岛问题是不是有正式定义?如果是这样,这个问题是不是满足它?的主要内容,如果未能解决你的问题,请参考以下文章

差距和孤岛 - Microsoft Access

SQL Server - 计算会话数 - 差距和孤岛

SQL 差距和孤岛问题与扭曲 - 根据前一个标志的持续时间重置标志

差距和孤岛问题 - 查询不适用于所有时期

具有开始和结束日期的差距和孤岛(有效期)

使用差距和孤岛知识找到最长时间不改变就业(SQL)