如何将Google Spreadsheet数据透视以展示耗时时长?
解决Google表格中事件间耗时的透视计算问题
先把你提供的示例数据整理成清晰的表格,方便后续操作:
| user | message_id | event | timestamp |
|---|---|---|---|
| john player | ekjf939e9313140_34k | delivered | 04/13/2018 12:56:30 |
| john player | ekjf939e9313140_34k | opened | 04/15/2018 16:05:00 |
| john player | ekjf939e9313140_34k | opened | 04/16/2018 22:15:20 |
| john player | ekjf939e9313140_34k | opened | 04/16/2018 23:47:33 |
| cristian dior | dsfsk0340344030fkjkj | delivered | 04/12/2018 18:45:21 |
接下来我给你两种实用方法,计算同一消息ID下不同事件的耗时(小时),并通过透视表展示结果:
方法一:辅助列 + 数据透视表(适合新手,可视化操作)
步骤1:添加辅助列计算基准时间
首先我们需要为每条数据找到对应消息ID的最早送达时间(作为计算耗时的基准):
- 在E列(表头命名为
First Delivered Time)的E2单元格输入公式:
下拉填充整个E列,这样每行都会自动匹配当前消息ID的最早=MINIFS(D:D, B:B, B2, C:C, "delivered")delivered时间。
步骤2:计算耗时(小时)
添加F列(表头命名为Hours Elapsed),在F2单元格输入:
=IF(E2="", "", (D2 - E2)*24)
这个公式会把时间差转换成小时数(日期差×24就是小时数),空值会自动跳过。
步骤3:创建透视表展示结果
- 选中包含所有列(A-F)的数据区域
- 点击顶部菜单栏「数据」→「数据透视表」,选择透视表放置的位置(新工作表或当前工作表)
- 在右侧透视表编辑器中配置:
- 行:添加
user和message_id(按用户和消息分组) - 列:添加
event(按事件类型分类) - 值:添加
Hours Elapsed,然后选择统计方式:- 选「最小值」:展示该事件相对于首次送达的最早耗时(比如首次打开的时间)
- 选「平均值」:展示该事件所有记录的平均耗时
- 选「最大值」:展示最晚发生的事件耗时
- 行:添加
方法二:用QUERY+LET函数直接计算(适合进阶用户,无需手动操作)
如果不想用辅助列,可以直接用数组公式一次性生成每个消息ID的关键耗时数据,比如计算首次送达→首次打开的耗时:
=ARRAYFORMULA( LET( // 获取每个消息ID的最早送达时间 delivered_data, QUERY(A:D, "SELECT B, MIN(D) WHERE C='delivered' GROUP BY B", 1), // 获取每个消息ID的最早打开时间 opened_data, QUERY(A:D, "SELECT B, MIN(D) WHERE C='opened' GROUP BY B", 1), // 关联两组数据 merged_data, VLOOKUP(delivered_data!A2:A, opened_data, {1,2}, FALSE), // 计算耗时(小时) time_diff, (merged_data!B:B - delivered_data!B:B)*24, // 拼接最终结果表格 HSTACK(delivered_data!A2:A, delivered_data!B2:B, merged_data!B2:B, time_diff) ) )
执行后会返回四列数据:message_id、首次送达时间、首次打开时间、耗时(小时),你可以直接把这个结果作为数据源再做透视,或者直接使用。
关键注意事项
- 确保
timestamp列是日期时间格式:选中D列→点击「格式」→「数字」→「日期时间」,否则时间差计算会出错。 - 如果同一个消息ID有多次
delivered事件,上述方法默认取最早的送达时间;如果需要对应每次送达的后续事件,需要额外按delivered的时间点分组。
内容的提问来源于stack exchange,提问作者sifar




