我有一个电子表格,其中包含多个条目,每个条目都有一个开始和结束时间。我希望能够识别重叠时间条目,然后能够通过可能将重叠组 ID 分配给重叠条目对来对重叠条目进行分组。开始和结束时间可以是一天中的任何时间。我想对它们进行分组的原因是我能够识别大数据集中的重叠时间,“分组”每个重叠时间,以便我可以从数据集中提取每个“组”并对每个重叠进行进一步计算“团体”。
我已经设法使用以下功能锻炼了“重叠存在”
=IF(SUMPRODUCT((startTime<=endTime)*(endTime>=startTime)),TRUE,FALSE)
但是,我正在努力确定如何对两个重叠条目进行分组,如上面的示例所示。
任何帮助将不胜感激!
这是 PowerQuery 的一种方法。
首先,将光标放在数据中的任意位置,然后按 Ctrl+T 创建表。它应该看起来像这样:
使用数据>获取和转换数据>从表/范围。当您在对话框中单击确定时,您将在 PowerQuery 编辑器中看到您的数据。它应该如下所示:
为了在每一行和每一行之间进行比较,我们将把这个数据集连接到它自己。为此,首先我们将创建此数据集的副本。展开窗口左侧的“查询”窗格,然后右键单击“表 1”查询并选择“参考”。
这将创建 Table1 查询的副本。为清楚起见,将第一个查询重命名为 A,将第二个查询重命名为 B。您可以通过右键单击查询并选择“重命名”来重命名查询。所以,现在你有两个查询:
选择查询 B,然后转到添加列>自定义列并像这样配置对话框:
单击确定时,您将看到以下内容:
单击 QueryA 列右上角的双箭头:
单击确定。这将创建新行。此查询中的每一行现在表示查询 B 中的每一行与查询 A 中的每一行的比较。
首先,我们可以过滤掉任何将员工 ID 与其自身进行比较的行(如上面的第一行)。首先单击 QueryA.Employee ID 列上的过滤器,然后选择 Number>Does not equal。像这样配置它,然后按 OK:
现在转到主页>高级编辑器并编辑以下行:
对此:
单击“确定”后,您将看到不再有行将员工 ID 与其自身进行比较。
现在我们可以创建一个列来标记重叠的位置。使用 Add column>Custom Column 并像这样配置它:
您可以看到,对于有重叠的行,该列正确显示 TRUE。
您现在可以选择重命名列,过滤 TRUE 的重叠列,然后右键单击重叠列并选择“删除”以从结果中隐藏该列。
当您单击 Home>Close & Load 时,数据将放回工作簿中。您现在可以继续分析(或者使用 PowerQuery 编辑器向查询添加步骤)。请务必将所有时间列的数据类型更改为时间(单击四列中每一列的列标题中的图标)
我很欣赏这似乎冗长,但这种方法的好处是:
编辑:要删除明显的“重复”(我不建议这样做,因为它会使以后的分析不太灵活),您可以执行以下操作:
首先,我们需要确定两行正在比较两边相同的两名员工。为此,我们将添加两个自定义列来计算最小员工 ID:
和最大员工 ID:
我们要做的是选择每对 Min/Max 员工 ID 的一次出现。为此,我们可以为每对分配一个组索引,然后在 Index=1 上过滤结果。
要分配组索引,请使用 Home>Group By 并进行如下配置:
你会看到这个:
转到主页>高级编辑器并将此行添加到查询中:
我从这个页面获取了这个代码和技术
您需要确保在上一行的末尾添加一个逗号,并将“in”部分更改为 #"Indexed" 而不是 #"Grouped Rows":
按“完成”后,单击行列顶部的双箭头并选择除 Min Employee ID 和 Max Employee ID 之外的所有列(您已经有了这些列)。取消选中“使用原始列名作为前缀”:
这是结果:
现在,在 1 上过滤“GroupIndex”,然后删除 Min Employee ID、Max Employee ID 和 GroupIndex(右键单击该列,然后选择 Remove):
这是这些附加步骤之后的完整查询: