我知道已经有一个与此非常相似的帖子了 – Excel 根据开始/结束时间计算并发会话数– 但是,尽管我尽力了,我还是无法复制和操纵建议的答案来满足我的需求。
我还希望检测用户 ID 何时从多台 PC 同时登录到旧式 Unix ERP 系统 - 他们可能会与同事共享其凭据。
数据示例如下:
Record # Time In Time Out User PC Name
1 10:54 10:55 Al PC1
2 10:55 16:55 Dave PC42
3 09:11 09:29 Al PC1
4 11:02 18:03 Al PC1
5 16:19 17:38 George PC678
6 16:43 17:41 Al PC678
7 16:46 17:39 Dave PC42
8 17:25 17:49 Al PC42
“开始时间”和“结束时间”值实际上是完整的日期/时间,因此您无需担心比较不同日期发生的事件。我在这里只显示时间,以避免提供太多信息. 以上数据可以用图形表示为:
在列表末尾(以及图表底部),您可以看到用户 Al 正在同时从多台 PC 访问系统,其他用户也从相同的 PC 访问系统。用户 Al 要么四处走动并登录(不太可能),要么其他用户能够以 Al 的身份登录以执行其权限不允许他们执行的任务。理想情况下,我希望有一个新列来突出显示当时来自不同 PC 上的用户 ID Al 的并发会话。记录 #4、6 和 8 将发出警报 - 记录 #2 和 7 正常,因为同一用户在同一台 PC 上登录。
答案1
您想要识别至少有一行具有相同用户 ID 且进入/退出时间范围重叠的行。这相当简单(至少在您知道答案之后)。第一步是找出间隔 Start 1 /End 1 与间隔 Start 2 /End 2重叠 当且仅当 Start 1 < End 2 和 End 1 > Start 2时。(如果您考虑一下,这很容易理解;如果您画出来就更容易了。)因此,对于每一行,我们希望计算登录/注销记录中上述情况为真的行,并且用户 ID 等于此行的用户 ID。这很简单
=COUNTIFS(A$2:A$9, "<"&B2, B$2:B$9, ">"&A2, C$2:C$9, "="&C2)
对于您的原始数据布局(其中时间是列 A
,暂停是 Column B
,并且用户是 Column C
)。这将计算出最小值为 1,因为每行都与自身重叠。您想查看哪些行重叠其他行,所以我们这样做
=IF(COUNTIFS(B$2:B$9, "<"&C2, C$2:C$9, ">"&B2, D$2:D$9, "="&D2) > 1, "Overlap", "")
一旦我改变了时间对于记录 #7(PC42 上的用户 Dave),从 16:46 到 16:56,以消除与记录 #2 的重叠(还PC42 上的用户 Dave),我认为这是无意的,我得到了以下结果:
我相信这就是你想要的。
好的,如果用户在重叠的时间段内登录到一台 PC 是可能的并且是有效的(正如 Dave 在记录 2 和 7 中的 PC42 上所做的那样),并且您不希望这些被算作重叠,那么我们需要修改我们的公式以仅计算 PC 不同的行:
=IF(COUNTIFS(A$2:A$9, "<"&B2, B$2:B$9, ">"&A2, C$2:C$9, "="&C2, D$2:D$9, "<>"&D2) > 0, "Overlap", "")
请注意,我们必须将测试从 更改> 1
为> 0
因为行不再自身重叠。