跨多日期精确到秒的重叠时间段并发次数统计需求
需求说明
我有如下结构的时间区间数据(示例1):
| Start | End |
|---|---|
| 18/11/2022 15:09:39 | 18/11/2022 15:09:54 |
| 18/11/2022 15:09:10 | 18/11/2022 15:09:24 |
需要精确到秒统计重叠时间段的并发次数,并且要统计每组独立重叠区间的最高并发数。比如下面的示例2数据:
| Start | End |
|---|---|
| 18/11/2022 14:57:09 | 18/11/2022 15:07:15 |
| 18/11/2022 15:06:02 | 18/11/2022 15:07:07 |
| 18/11/2022 15:03:10 | 18/11/2022 15:03:26 |
| 18/11/2022 15:02:52 | 18/11/2022 15:03:05 |
| 18/11/2022 14:58:31 | 18/11/2022 14:58:44 |
| 18/11/2022 14:27:50 | 18/11/2022 14:56:38 |
| 18/11/2022 14:52:21 | 18/11/2022 14:54:11 |
前5行的时间段互相重叠,最高并发数为5;最后2行的时间段互相重叠但不与前5行重叠,需单独统计为一组,最高并发数为2。同时数据涉及多日期,解决方案必须支持跨日期场景(示例3数据如下):
| Start | End |
|---|---|
| 18/11/2022 9:59:27 | 18/11/2022 10:00:07 |
| 18/11/2022 9:49:51 | 18/11/2022 9:53:21 |
| 18/11/2022 9:38:16 | 18/11/2022 9:46:59 |
| 18/11/2022 9:45:37 | 18/11/2022 9:45:45 |
| 18/11/2022 9:41:44 | 18/11/2022 9:42:14 |
| 18/11/2022 8:34:01 | 18/11/2022 8:34:44 |
| 18/11/2022 8:11:46 | 18/11/2022 8:13:58 |
| 18/11/2022 8:08:46 | 18/11/2022 8:09:41 |
| 17/11/2022 19:18:47 | 17/11/2022 19:18:54 |
| 17/11/2022 18:50:49 | 17/11/2022 18:51:11 |
| 17/11/2022 17:40:20 | 17/11/2022 17:40:45 |
| 17/11/2022 17:00:04 | 17/11/2022 17:03:48 |
| 17/11/2022 16:58:35 | 17/11/2022 16:58:50 |
| 17/11/2022 16:54:31 | 17/11/2022 16:57:55 |
| 17/11/2022 16:34:01 | 17/11/2022 16:34:29 |
| 17/11/2022 16:32:30 | 17/11/2022 16:33:31 |
| 17/11/2022 16:28:23 | 17/11/2022 16:32:59 |
| 17/11/2022 16:30:38 | 17/11/2022 16:30:57 |
| 17/11/2022 16:22:10 | 17/11/2022 16:22:27 |
| 17/11/2022 15:51:36 | 17/11/2022 15:51:48 |
| 17/11/2022 15:48:10 | 17/11/2022 15:48:49 |
| 17/11/2022 15:40:22 | 17/11/2022 15:40:46 |
| 17/11/2022 15:30:32 | 17/11/2022 15:36:44 |
| 17/11/2022 15:33:11 | 17/11/2022 15:34:30 |
| 17/11/2022 15:32:05 | 17/11/2022 15:33:14 |
| 17/11/2022 15:23:27 | 17/11/2022 15:32:31 |
之前尝试过的方案仅支持天级精度,无法满足秒级统计需求。
方案一:Excel动态数组公式(适合Excel 365/2021)
步骤1:提取并排序所有时间节点
假设你的Start时间在A列,End时间在B列,找个空白单元格(比如D2)输入下面的公式,它会把所有开始、结束时间提取出来,去重后按时间排序:
=SORT(UNIQUE(VSTACK(A2:A27,B2:B27)))
把A2:A27、B2:B27换成你实际的数据范围就行
步骤2:计算每个时间点的并发数
在E2单元格输入这个公式,逐个计算每个时间节点上有多少个时间段在运行:
=BYROW(D2:D53,LAMBDA(x,SUM(--(A2:A27<=x)*(B2:B27>x))))
D2:D53是步骤1生成的时间节点范围,记得同步替换A/B列的范围
步骤3:分组统计每个重叠区间的最高并发
先在F2输入这个公式,给每个时间节点标记所属的区间组:
=SCAN(0,E2:E53,LAMBDA(a,b,IF(b=0,a,a+(b<>INDEX(E2:E53,MAX(1,ROW()-1))))))
然后在G2输入这个,生成每个组对应的并发数:
=UNIQUE(HSTACK(F2:F53,E2:E53))
最后用PIVOTBY函数直接算出每个组的最高并发:
=PIVOTBY(F2:F53,E2:E53,E2:E53,MAX,,0)
方案二:Power Query(大数据量更高效)
如果数据量较大,用Power Query处理更稳定:
步骤1:导入数据到Power Query
选中你的数据区域,点击数据选项卡 -> 从表格/区域,进入Power Query编辑器,先把Start和End列的类型改成日期/时间。
步骤2:生成时间节点与并发数
- 添加自定义列,命名为
事件,公式:
{{"开始", [Start]}, {"结束", [End]}}
- 点击
事件列右侧的展开按钮,将其拆分为新行。 - 把展开后的两列重命名为
事件类型和时间点,然后按时间点排序。 - 添加自定义列
并发数,公式:
List.Sum(List.Transform(Table.Range(#"排序的行",0,Index.Position()), (row) => if row[事件类型] = "开始" then 1 else -1))
步骤3:分组统计最高并发
- 添加自定义列
区间组,公式:
List.Accumulate(List.Range(#"添加自定义"[并发数],0,Index.Position()), 0, (state, current) => if current = 0 then state else state + (current <> List.Range(#"添加自定义"[并发数],0,Index.Position()-1){Index.Position()-1}?))
- 筛选掉
并发数为0的行(这些是区间之间的分隔点)。 - 点击
转换选项卡 ->分组依据,分组列选区间组,新列名设为最高并发,操作选最大值,列选并发数。 - 点击
关闭并上载,即可得到每个独立重叠区间的最高并发次数。
内容的提问来源于stack exchange,提问作者Michael Smith
相关产品推荐
相关产品推荐

