1

我的数据如下所示:
数据按 processID 排序,然后按开始日期排序。
步骤开始日期决定步骤的顺序。每个步骤都由批准人批准(下面的批准人 ID 是任意的)

╔═══════════╦══════════════════════════╦═══════════════╦════════════╗
║ ProcessID ║         StepName         ║Step Start Date║ ApproverID ║
╠═══════════╬══════════════════════════╬═══════════════╬════════════╣
║         1 ║ Supervisor Approval      ║1/1/2013 07:24 ║ A          ║
║         1 ║ Sales Manager Approval   ║1/1/2013 13:35 ║ B          ║
║         1 ║ General Manager Approval ║1/3/2013 08:00 ║ B          ║
║         1 ║ CEO Approval             ║1/5/2013 14:40 ║ C          ║
║         2 ║ Supervisor Approval      ║1/2/2013 07:00 ║ A          ║
║         2 ║ Sales Manager Approval   ║1/2/2013 08:00 ║ B          ║
║         2 ║ General Manager Approval ║1/2/2013 09:00 ║ C          ║
║         2 ║ CEO Approval             ║1/2/2013 10:00 ║ B          ║
╚═══════════╩══════════════════════════╩═══════════════╩════════════╝

我需要一个 TSQL 查询,该查询将为在 2 个或多个连续步骤中具有相同 ApproverID 的任何进程返回 [ProcessID]。

因此,在上面的示例中,将返回 ProcessID #1,因为审批者 B 批准了步骤 2 和 3(连续)。ProcessID #2 不会返回,因为即使审批者 B 批准了步骤 2 和 4,它们也不连续。

这是一个带有架构设置和一些示例数据的 SQL fiddle:SQL Fiddle

任何帮助将不胜感激!

4

2 回答 2

1

这将根据数据集的要求返回 Process 1:

with nextSteps as
(
  select s.ProcessID
    , disapprove = case when s.ApproverID <= n.ApproverID or n.ApproverID is null
      then 0 else 1 end
  from steps s
    outer apply
    (
      select top 1 ApproverID
      from steps n
      where s.ProcessID = n.ProcessID
        and s.StepStartDate < n.StepStartDate
      order by n.StepStartDate
    ) n
)
select ProcessID
from nextSteps
group by ProcessID
having sum(disapprove) = 0

SQL Fiddle 与演示

基本上对于每个流程步骤,我们都会在同一流程中获得下一步,并检查下一步是否由相同或更大的批准者进行。

如果一行或多行失败,则不返回 ProcessID。

评论后编辑:

with nextSteps as
(
  select s.ProcessID
    , disapprove = case when s.ApproverID = n.ApproverID then 1 else 0 end
  from steps s
    outer apply
    (
      select top 1 ApproverID
      from steps n
      where s.ProcessID = n.ProcessID
        and s.StepStartDate < n.StepStartDate
      order by n.StepStartDate
    ) n
)
select ProcessID
from nextSteps
group by ProcessID
having sum(disapprove) > 0

SQL Fiddle 与演示

这个新的稍有改动的查询适用于以下批准者模式,如 SQL Fiddle 所示:

ProcessID 1: A,B,B,C - 有连续审批者,应返回。

ProcessID 2:A、B、C、B - 没有连续的审批者,不应返回。

ProcessID 3:A、B、C、D - 没有连续的审批者,不应返回。

非常相似,检查 ProcessID 中每个步骤的下一行,如果至少有一个连续的批准者被识别,则返回 ProcessID。

我还检查了您添加的 SQL Fiddle 中的数据 - 似乎正在工作:

SQL Fiddle 更多数据

于 2013-04-26T20:34:43.703 回答
0

多亏了 Ian 的帮助,我得到了以下结果:

WITH Steps AS
(
  SELECT
    [CurStep].[ProcessID],
    ConsecutiveApproval =
      CASE
        WHEN [CurStep].[ApproverID] = [NextStep].[ApproverID] THEN 1
        ELSE 0
      END
  FROM [Processes] AS CurStep
    OUTER APPLY
    (
      SELECT TOP 1
        [NextStep].[ApproverID]
      FROM
        [Processes] AS NextStep
      WHERE
        [CurStep].[ProcessID] = [NextStep].[ProcessID]
        AND [CurStep].[StepStartDate] < [NextStep].[StepStartDate]
      ORDER BY [NextStep].[StepStartDate]
    ) AS NextStep
)
SELECT   [ProcessID]
FROM     [Steps]
GROUP BY [Steps].[ProcessID]
HAVING   SUM([ConsecutiveApproval]) > 0

工作 SQL 小提琴

于 2013-04-27T11:54:33.060 回答