LastModifiedTime に基づいて WorkflowId ごとに 20 が常に最後になると想定される場合、それは非常に単純です。EventTime を見る必要さえありません。Row_Number は必要ありません:
SELECT *
FROM
master.ProcessLogging L
WHERE
L.ProcessCode = 20
AND EXISTS (
SELECT *
FROM master.ProcessLogging L2
WHERE
L.WorkflowId = L2.WorkflowId
AND L.LastModifiedTime < L2.LastModifiedTime
AND L2.ProcessCode = 10
)
これにより、順不同のワークフローごとに 1 行が返されるため、 のSELECT Count(*)
代わりに簡単に変更できますSELECT *
。
EventTime も重要になった場合は、それを exists 句に OR として LastModifiedTime と一緒に追加することもできます。
それらの間の時間差が必要であることに気付きました(行ごとに詳細を表示すると、単一のカウントを返すことができないことを意味します)。SQL 2005 以降でこれを実行できるクエリを次に示します。SQL Server 2005 以外を使用している場合はお知らせください。別のクエリを作成します。
SELECT
*,
MinutesApart = DateDiff(minute, L.LastModifiedTime, L2.LastModifiedTime)
FROM
master.ProcessLogging L
CROSS APPLY (
SELECT TOP 1 *
FROM master.ProcessLogging L2
WHERE
L.WorkflowId = L2.WorkflowId
AND L.LastModifiedTime < L2.LastModifiedTime
AND L2.ProcessCode = 10
ORDER BY L2.LastModifiedTime DESC
) L2
WHERE
L.ProcessCode = 20
20 の後に複数の 10 コードがある場合、これは最悪のコードのみを表示することに注意してください。それらすべてを表示する (そして 20 個のコードごとに複数の行を取得する) には、これを単純な自己結合に変更できます。
SELECT
*,
MinutesApart = DateDiff(minute, L.LastModifiedTime, L2.LastModifiedTime)
FROM
master.ProcessLogging L
INNER JOIN master.ProcessLogging L2
ON L.WorkflowId = L2.WorkflowId
WHERE
L.ProcessCode = 20
AND L2.ProcessCode = 10
AND L.LastModifiedTime < L2.LastModifiedTime