如果基于 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
)
这将为每个乱序工作流返回一行,因此您可以轻松地将其更改为SELECT Count(*)
而不是SELECT *
.
如果 EventTime 也变得很重要,您可以将其添加到 exists 子句中,作为与 LastModifiedTime 的 OR。
我刚刚注意到您想要它们之间的时间差(通过显示每行的详细信息意味着您不能返回单个计数)。这是一个可以在 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