如何创建流程挖掘事件日志

您将学到什么

本指南将介绍如何从零开始创建流程挖掘事件日志。我们将介绍每个事件日志都需要的三个必需列,讲解一个真实场景示例,并展示如何使用Excel和SQL创建您的第一个事件日志。

什么是流程挖掘事件日志?

**相关内容:**进一步了解流程改进,并查找适用于您系统的数据模板。另请阅读我们为何不使用开箱即用的连接器,而选择简单的数据模板。

流程挖掘事件日志是一张记录业务流程中发生情况的表。它跟踪每个案例在系统中流转时经历的每个步骤。流程挖掘软件利用这些数据展示流程实际如何运行。

每个事件日志都需要三个必需列:

含义 示例
案例ID 将相关事件归为一组的唯一标识符 订单 #12345
时间戳 事件发生的时间 2025-01-15 09:30:00
活动 发生了什么 “已下单”

就是这些。只要有这三列,您就可以开始进行流程挖掘。其他信息,例如客户姓名、订单金额或员工ID,都是可选的。这些额外字段称为“属性”,可以为分析提供更多背景。

理解事件与活动的区别

继续之前,我们先澄清一个常见的疑问。

活动是一类操作,例如“已发货”或“已收到付款”。您可以将其理解为类别或标签。

事件是该活动的一次具体发生。例如,订单#12345在1月15日14:30发货,这就是一个事件。

您的事件日志包含事件,每个事件都有一个活动名称。在实际使用中,人们经常交替使用这两个术语,这没有问题。请记住:活动描述“做了什么”,事件描述“何时为谁发生”。

示例:Pizza Palace订单系统

为了让本指南更实用,我们使用一个虚构系统作为示例。假设您管理Pizza Palace,这是一家拥有在线订餐系统的本地披萨店。客户通过网站下单,员工制作披萨,配送员负责送餐。

Pizza Palace系统包含多个数据库表,用于跟踪订单流程的不同部分:

  • orders:基本订单信息(订单ID、客户、下单时间)
  • order_items:订单内容(披萨、配菜、饮料)
  • kitchen_queue:订单进入和离开厨房的时间
  • delivery_assignments:配送员分配和配送跟踪
  • payments:支付处理记录

您的目标是创建一份事件日志,展示每个订单从下单到配送完成的完整旅程。

事件类型:直接事件与推断事件

创建事件日志时,您会遇到两类事件:

直接事件

直接事件会明确记录在系统中。用户点击了按钮,或系统记录了一项操作,数据库中也会保存对应的时间戳。

Pizza Palace示例:

  • 下单(时间戳位于orders表)
  • 收到付款(时间戳位于payments表)
  • 完成配送(时间戳位于delivery_assignments表)

推断事件

推断事件没有自己的时间戳,但您可以根据其他数据确定其发生时间。

Pizza Palace示例:

  • “将订单分配给配送员”可能没有自己的时间戳,但delivery_assignments表中的created_at字段会显示分配时间
  • “披萨备好”可以根据厨房队列状态变为“已完成”的时间推断出来

两者的关键区别在于:直接事件会被明确记录,推断事件则需要您解读其他数据字段。两者都适用于流程挖掘,也都很有价值。

规划事件日志

提取数据前,先确定要记录哪些事件。以Pizza Palace为例,我们跟踪以下活动:

  1. 已下单 - 客户提交订单
  2. 已收到付款 - 付款处理成功
  3. 订单已发送至厨房 - 订单进入准备队列
  4. 订单已备好 - 厨房将订单标记为完成
  5. 已分配配送员 - 已为配送安排配送员
  6. 已完成配送 - 订单已送达客户

对于每个事件,请确定:

  • 数据位于哪张表
  • 哪个字段提供时间戳
  • Case ID是什么(本例中为订单ID)

以下是我们的映射:

活动 来源表 时间戳字段 Case ID字段
已下单 orders created_at id
已收到付款 payments payment_time order_id
订单已发送至厨房 kitchen_queue queue_entry_time order_id
订单已备好 kitchen_queue completed_time order_id
已分配配送员 delivery_assignments assigned_at order_id
已完成配送 delivery_assignments delivered_at order_id

添加Case和事件属性

Case ID、Timestamp和Activity是必需字段。属性通过增加额外列提供上下文,让分析更有价值。

Case属性

Case属性描述整个Case,即订单,并且在该Case的每个事件中保持不变:

  • 客户姓名
  • 订单总金额
  • 配送地址
  • 订购物品数量

事件属性

事件属性适用于单个事件:

  • 配送员姓名(仅适用于配送事件)
  • 付款方式(仅适用于付款事件)
  • 厨房工位(仅适用于厨房事件)

**实用提示:**即使某项属性不适用于特定事件,也可以在每一行中保留所有属性。例如,“已下单”这一行可以保留空白的“配送员姓名”列。这样可以让事件日志保持简单的扁平表格格式,便于流程挖掘工具处理。

构建事件日志:简单结构

最终的事件日志应为一张单表,每行对应一个事件。以下是Pizza Palace事件日志的示例:

Case ID 时间戳 活动 客户 订单金额 配送员 付款方式
1001 2025-01-15 18:30:00 已下单 John Smith 45.99
1001 2025-01-15 18:30:15 已收到付款 John Smith 45.99 信用卡
1001 2025-01-15 18:31:00 订单已发送至厨房 John Smith 45.99
1001 2025-01-15 18:45:00 订单已备好 John Smith 45.99
1001 2025-01-15 18:46:00 已分配配送员 John Smith 45.99 Maria Garcia
1001 2025-01-15 19:05:00 已完成配送 John Smith 45.99 Maria Garcia
1002 2025-01-15 18:35:00 已下单 Jane Doe 28.50
1002 2025-01-15 18:35:20 已收到付款 Jane Doe 28.50 PayPal

请注意,客户和订单金额等Case属性会在同一Case的每个事件中重复出现。这种重复是有意为之,可以让数据更易于处理。

方法一:在Excel中创建事件日志

如果您可以将数据导出到电子表格,就能手动创建事件日志。这种方法适合小型数据集,也有助于您掌握基础知识。

第1步:将每种事件类型导出到单独的工作表

为每种活动类型创建一个工作表:

工作表1:已下单

Case ID 时间戳 活动 客户 订单金额
1001 2025-01-15 18:30:00 已下单 John Smith 45.99
1002 2025-01-15 18:35:00 已下单 Jane Doe 28.50

工作表2:已收到付款

Case ID 时间戳 活动 客户 订单金额 付款方式
1001 2025-01-15 18:30:15 已收到付款 John Smith 45.99 信用卡
1002 2025-01-15 18:35:20 已收到付款 Jane Doe 28.50 PayPal

第2步:统一列

确保每个工作表包含相同的列,且顺序一致。必要时添加空列:

工作表1:已下单(更新后)

Case ID 时间戳 活动 客户 订单金额 配送员 付款方式
1001 2025-01-15 18:30:00 已下单 John Smith 45.99

第3步:合并所有工作表

创建一个新的“事件日志”工作表。将每个活动工作表中的所有行依次复制并粘贴到这个合并后的工作表中。

第4步:先按Case ID排序,再按时间戳排序

选中所有数据,然后按以下字段排序:

  1. Case ID(升序)
  2. 时间戳(升序)

这样可以让每个Case中的事件按时间顺序排列,便于您跟踪每个订单的完整过程。

第5步:导出为CSV

将合并后的工作表保存为CSV文件。这种格式几乎适用于所有流程挖掘工具。

Excel提示:

  • 使用VLOOKUP或XLOOKUP从订单表中提取Case属性,例如客户姓名
  • 统一日期格式(YYYY-MM-DD HH:MM:SS通常最合适)
  • 导出前删除重复事件

方法二:使用SQL创建事件日志

对于大型数据集或需要定期执行的提取任务,SQL更高效,也更易于重复执行。关键技术是使用UNION ALL,将多个查询合并为一个结果集。

了解UNION ALL

UNION ALL会将多个SELECT语句的结果依次合并。每个SELECT都会向最终结果中添加行。所有SELECT语句必须包含相同数量的列,且数据类型兼容。

完整SQL示例

以下SQL查询会创建Pizza Palace事件日志:

-- Event Log Extraction for Pizza Palace
-- This query combines multiple event types into a single event log
-- Each SELECT block represents one activity type

-- Event 1: Order Placed
-- Source: orders table
-- This captures when customers submit their orders
SELECT 
    o.id AS case_id,                          -- The order ID is our case identifier
    o.created_at AS timestamp,                -- When the order was placed
    'Order Placed' AS activity,               -- The activity name (hardcoded)
    o.customer_name AS customer,              -- Case attribute: who ordered
    o.total_amount AS order_value,            -- Case attribute: order value
    NULL AS driver,                           -- Not applicable for this event
    NULL AS payment_method                    -- Not applicable for this event
FROM orders o
WHERE o.created_at >= '2025-01-01'            -- Filter to your desired date range

UNION ALL

-- Event 2: Payment Received
-- Source: payments table
-- This captures successful payment processing
SELECT 
    p.order_id AS case_id,
    p.payment_time AS timestamp,
    'Payment Received' AS activity,
    o.customer_name AS customer,              -- Join to get case attributes
    o.total_amount AS order_value,
    NULL AS driver,
    p.payment_method AS payment_method        -- Event-specific attribute
FROM payments p
JOIN orders o ON p.order_id = o.id            -- Join to get order details
WHERE p.payment_time >= '2025-01-01'
  AND p.status = 'successful'                 -- Only include successful payments

UNION ALL

-- Event 3: Order Sent to Kitchen
-- Source: kitchen_queue table
-- This captures when the kitchen starts working on the order
SELECT 
    k.order_id AS case_id,
    k.queue_entry_time AS timestamp,
    'Order Sent to Kitchen' AS activity,
    o.customer_name AS customer,
    o.total_amount AS order_value,
    NULL AS driver,
    NULL AS payment_method
FROM kitchen_queue k
JOIN orders o ON k.order_id = o.id
WHERE k.queue_entry_time >= '2025-01-01'

UNION ALL

-- Event 4: Order Ready
-- Source: kitchen_queue table (different timestamp field)
-- This is an inferred event based on when the kitchen marked it complete
SELECT 
    k.order_id AS case_id,
    k.completed_time AS timestamp,            -- Different timestamp than entry
    'Order Ready' AS activity,
    o.customer_name AS customer,
    o.total_amount AS order_value,
    NULL AS driver,
    NULL AS payment_method
FROM kitchen_queue k
JOIN orders o ON k.order_id = o.id
WHERE k.completed_time >= '2025-01-01'
  AND k.completed_time IS NOT NULL            -- Only include completed orders

UNION ALL

-- Event 5: Assigned to Driver
-- Source: delivery_assignments table
-- This captures when a driver is assigned to deliver the order
SELECT 
    d.order_id AS case_id,
    d.assigned_at AS timestamp,
    'Assigned to Driver' AS activity,
    o.customer_name AS customer,
    o.total_amount AS order_value,
    d.driver_name AS driver,                  -- Event-specific attribute
    NULL AS payment_method
FROM delivery_assignments d
JOIN orders o ON d.order_id = o.id
WHERE d.assigned_at >= '2025-01-01'

UNION ALL

-- Event 6: Delivery Completed
-- Source: delivery_assignments table (different timestamp field)
-- This captures when the order was delivered to the customer
SELECT 
    d.order_id AS case_id,
    d.delivered_at AS timestamp,
    'Delivery Completed' AS activity,
    o.customer_name AS customer,
    o.total_amount AS order_value,
    d.driver_name AS driver,
    NULL AS payment_method
FROM delivery_assignments d
JOIN orders o ON d.order_id = o.id
WHERE d.delivered_at >= '2025-01-01'
  AND d.delivered_at IS NOT NULL              -- Only include completed deliveries

-- Final ordering: by case, then by time
-- This makes the event log easy to read and follow
ORDER BY case_id, timestamp;

如何扩展此查询

如需向日志中添加更多事件:

  1. 复制其中一个SELECT代码块作为模板
  2. 更改表名为您的来源表
  3. 更新时间戳字段为正确的列
  4. 更改活动名称以描述该事件
  5. 按需调整属性
  6. 添加适当的WHERE条件以筛选数据

例如,如需添加“尝试配送”事件:

UNION ALL

-- Event 7: Delivery Attempted
-- Add this to track failed delivery attempts
SELECT 
    d.order_id AS case_id,
    d.attempt_time AS timestamp,
    'Delivery Attempted' AS activity,
    o.customer_name AS customer,
    o.total_amount AS order_value,
    d.driver_name AS driver,
    NULL AS payment_method
FROM delivery_attempts d
JOIN orders o ON d.order_id = o.id
WHERE d.attempt_time >= '2025-01-01'

创建事件日志的最佳实践

1.先从简单开始,再逐步增加复杂度

先从三个必需列和几个关键活动开始。创建基础事件日志并将其加载到流程挖掘工具后,您可以继续添加更多事件和属性。

2.验证数据

开始分析前,请检查事件日志中是否存在以下常见问题:

  • 缺少时间戳 - 没有时间戳的事件会导致流程挖掘无法正常进行
  • 重复事件 - 同一事件被记录两次会使结果失真
  • 事件顺序错误 - “订单已备好”早于“已下单”,说明数据质量存在问题
  • 孤立事件 - 其Case ID未出现在其他活动中的事件

3.记录提取过程

请记录以下内容:

  • 使用了哪些表和审计轨迹
  • 应用了哪些筛选条件
  • 何时执行了提取
  • 做出了哪些假设

日后更新或排查事件日志时,这些记录会很有帮助。

4.统一命名方式

确保不同提取任务中的活动名称保持一致:

  • 在某些提取结果中使用“订单已创建”、在另一些结果中使用“新订单”,不如统一使用“已下单”
  • 选择一种命名规范并始终遵循

5.处理时区

如果数据来自多个系统或地区,请确保所有时间戳使用同一时区。为保持一致性,通常建议使用UTC。

常见挑战与解决方案

创建流程挖掘事件日志时常见挑战的示意图

挑战:事件没有时间戳

有些事件可能没有自己的时间戳。例如,“订单已批准”事件可能只通过布尔标记表示。

**解决方案:**查找相关时间戳。您可能会找到“approved_at”字段,也可以使用批准标记发生变化时的“modified_at”时间戳。

挑战:事件量非常大

如果事件数量达到数百万,提取查询可能运行缓慢,甚至失败。

解决方案:

  • 添加日期筛选条件,限制提取时间范围
  • 分批提取,每次处理一个月,之后再合并文件
  • 考虑使用专用ETL工具进行大规模提取

下一步:将事件日志加载到流程挖掘工具

将事件日志创建为CSV文件或数据库导出文件后,您就可以将其加载到流程挖掘工具中。大多数工具的操作流程类似:

  1. 上传文件,或将流程挖掘工具连接到已提取的数据。
  2. 映射列(Case ID、Timestamp、Activity)
  3. 配置其他属性
  4. 生成流程图

ProcessMind这样的现代流程挖掘工具可以简化这一过程。上传事件日志数据后,工具会自动将流程可视化,揭示瓶颈、变体和改进机会,帮助您降低成本、优化运营流程。

结论

创建流程挖掘事件日志不需要专用工具或深厚的技术知识。其核心是将流程挖掘数据整理成一张包含三个必需列的表:Case ID、Timestamp和Activity。

无论是使用Excel处理较小的数据集,还是使用SQL处理更大、更复杂的提取任务,基本原则都相同:

  1. 确定要跟踪的事件
  2. 找到每种事件类型对应的时间戳
  3. 将所有内容合并到一张表中
  4. 添加属性,丰富分析维度

最难的部分不是技术提取,而是充分了解业务运营,从而判断哪些事件真正重要。先从下单、订单完成等明显事件开始,再根据流程挖掘工具揭示的洞察逐步补充细节。

想进一步深入?请查看我们的持续流程改进页面,详细了解Purchase to Pay、Purchase to PayOrder to CashAccounts Payable等常见流程的活动和数据要求。这些资源还提供SAP、Oracle和Microsoft Dynamics等知名系统的数据模板,帮助您更快创建事件日志。

立即开始

不要等待完美的事件日志。从现有数据开始,利用创建的流程图获取经验,并持续迭代。即使只有包含基础活动的简单事件日志,也能揭示流程的真实运行方式。

相关文章

在收件箱中接收流程挖掘和工作流优化的专家洞察
流程瓶颈分析:实用指南

流程瓶颈分析:实用指南

了解流程瓶颈分析如何将流程挖掘数据转化为业务改进机会。探索模式、识别瓶颈并提升绩效。

我们为何跳过开箱即用的连接器

我们为何跳过开箱即用的连接器

流程挖掘连接器可能带来复杂性、延迟和供应商锁定。了解数据模板如何简化流程挖掘的数据准备。

精益流程改进:数据驱动指南

精益流程改进:数据驱动指南

了解DMAIC流程、六西格玛流程和精益流程改进工具,推动业务取得可衡量的成果。

Celonis替代方案:比较流程挖掘工具

Celonis替代方案:比较流程挖掘工具

比较Celonis流程挖掘与ProcessMind,找到适合您流程、预算和目标的软件。

设计更优流程,构建互联架构,始终掌控全局。

无需信用卡,无需等待,即可立即访问。将您组织的工作方式转化为清晰、互联的流程设计。

构建流程架构,定义所有权和控制措施,并在各个层级统一角色与职责。

开始免费试用,为流程治理、管理和持续改进建立可靠的统一基础。