1

次のようなデータがあります
。データはプロセス ID 順、次にステップ開始日順に並べられています。
ステップの開始日によって、ステップの順序が決まります。各ステップは承認者によって承認されます (以下の承認者 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          ║
╚═══════════╩══════════════════════════╩═══════════════╩════════════╝

2 つ以上の連続したステップで同じ ApproverID を持つプロセスの [ProcessID] を返す TSQL クエリが必要です。

上記の例では、承認者 B がステップ 2 と 3 を (連続して) 承認したため、ProcessID #1 が返されます。承認者 B がステップ 2 と 4 を承認したにもかかわらず、それらが連続していなかったため、ProcessID #2 は返されません。

スキーマのセットアップといくつかのサンプル データを使用した SQL フィドルを次に示します。SQL フィドル

どんな助けでも大歓迎です!

4

2 に答える 2

1

これは、データセットから必要に応じてプロセス 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

demo を使用した SQL Fiddle

基本的に、各プロセス ステップに対して、同じプロセスの次のステップを取得し、この次のステップが同じまたはそれ以上の承認者によるものであることを確認します。

1 つ以上の行が失敗した場合、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

demo を使用した SQL Fiddle

このわずかに変更された新しいクエリは、SQL Fiddle に示されているように、次の承認者パターンで機能します。

ProcessID 1: A、B、B、C - 連続した承認者がいて、返される必要があります。

ProcessID 2: A、B、C、B - 連続した承認者がいないため、返されません。

ProcessID 3: A、B、C、D - 連続した承認者がいないため、返されません。

非常によく似ており、ProcessID の各ステップの次の行をチェックし、少なくとも 1 人の連続した承認者が識別された場合は 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 に答える