1

我有这个问题我必须弄清楚希望我能有效地解释它。

  • Event的操作顺序是:开始→沟通→销售完成
  • 状态的操作顺序是:工作→完成

我需要确保每个用户都遵循流程而不是跳过步骤

所以就像在这个例子中:

表格示例

  • Bobo 正在与两个客户合作
    • 第一个客户,他仍处于沟通阶段,但他正在关注操作顺序的流程
    • 但在他的第二个客户上,他没有完成 Start 状态,然后继续进行 Communicating。
  • Mike 从工作状态的开始事件到完成状态的通信事件,再到工作状态的销售完成事件。所以迈克也没有遵循操作顺序。

显然,在像这样的超小规模上,只需要稍微看一下这个就可以看到那个。不幸的是,在任何给定时间,我们都有数百名用户和数千名客户与之合作。

我只需要计算未遵循流程的客户 ID(这不是他们没有完成完整流程而错过步骤的问题。)以及与该客户合作的用户名

所以我猜结果看起来像

Bobo     1
Mike     1

这意味着 Bobo 有 1 个他正在处理的帐户,他跳过了与 Mike 相同的步骤。

4

2 回答 2

0

如果您的应用程序中的阶段以非常严格的顺序定义,您可以使用这种方法或类似的逻辑,并且您可以拥有如下的参考表。

with t2 as
(
select 1 id, 'start'            event from dual union all
select 2 id, 'communicating'    event from dual union all
select 3 id, 'salecomplete'     event from dual
)
select * from t2;

        ID EVENT
---------- -------------
         1 start
         2 communicating
         3 salecomplete

您可以在数据中获取 order_id/workflow_id,然后检查是否有任何其他工作流项目应该在该项目之前,但没有。

例如。检查没有“通信”的“完成”事件。(或)检查没有“开始”事件的“通信”事件。

这是代码。我只包含了客户 ID 级别,但将其扩展到与特定客户打交道的用户是相当直接的。

with t1 as  (
  select 100 cust, 'start'          event from dual union all
  select 100 cust, 'salecomplete'   event from dual union all
  select 200 cust, 'communicating'  event from dual union all
  select 200 cust, 'salecomplete'   event from dual union all
  select 300 cust, 'salecomplete'   event from dual union all
  select 400 cust, 'start'          event from dual union all
  select 400 cust, 'communicating'  event from dual union all
  select 400 cust, 'salecomplete'   event from dual
),
t2 as
(
select 1 id, 'start'            event from dual union all
select 2 id, 'communicating'    event from dual union all
select 3 id, 'salecomplete'     event from dual
),
t3 as
(
select t1.cust, t2.*
  from t1, t2
  where t1.event = t2.event
)
select * from t3 tgt
where tgt.id <> 1 --initial event can exist by itself
  and not exists (
   select 1
     from t3 src
     where tgt.cust = src.cust
       and tgt.id -1 = src.id
);

这将显示缺少前一个事件的所有事件。

      CUST         ID EVENT
---------- ---------- -------------
       100          3 salecomplete
       200          2 communicating
       300          3 salecomplete

要获取发生这种情况的客户列表,只需在最后一个查询中使用 dist cust 即可。

...
      CUST
----------
       100
       200
       300
于 2013-02-06T21:39:27.740 回答
0

你不能用你的表结构做你想做的事。在 SQL 中,表本质上是无序的。你无法知道第一件事和第二件事发生了什么。

没有这些信息,就不可能确定序列。

您是否有对行进行排序的 id 或日期时间?

使用这样的字段,您可以获得下一个状态:

select t.*,
       lead(EVENT) over (partition by username, customerid order by thedatetime) as nextEvent,
       lead(status) over (partition by username, customerid order by thedatetime) as nextStatus
from t

接下来,您可以使用您的逻辑:

select t.*
from (select t.*,
             lead(EVENT) over (partition by username, customerid order by thedatetime) as nextEvent,
             lead(status) over (partition by username, customerid order by thedatetime) as nextStatus
      from t
     ) t
where not (event = 'Start' and coalesce(nextEvent, 'Communicating') = 'Communicating' or
           event = 'Communicating' and coalesce(nextEvent, 'Sale Complete') = 'Sale Complete' or
           event = 'Sale Complete' and nextEvent is not null or
           status = 'Working' and coalesce(nextstatus, 'Complete') = 'Complete' or
           status = 'Complete' and nextstatus is not null
          )

这提供了所有信息。如果您只想要 customerIds,请使用:

select distinct CustomerId
于 2013-02-06T21:31:56.750 回答