您可以尝试以下方法。您可以在 SSMS 中运行每个场景。
场景一
DECLARE @data table ( InstanceID int, [TimeStamp] datetime, StartTime datetime );
INSERT INTO @data VALUES
( 1, '08/22/2020 07:06:00', NULL ),
( 2, '08/22/2020 12:30:00', NULL ),
( 4, '08/22/2020 14:32:00', NULL ),
( 6, '08/22/2020 17:13:00', '08/22/2020 17:30:00' );
WITH cte AS (
SELECT
ROW_NUMBER() OVER ( ORDER BY [TimeStamp] ) AS id,
InstanceID,
[TimeStamp],
StartTime
FROM @data
)
SELECT
InstanceID, [TimeStamp], StartTime
FROM cte
OUTER APPLY (
SELECT CASE
WHEN cte.id = 1 AND cte.StartTime IS NULL THEN 1
WHEN cte.id = 1 AND cte.StartTime IS NOT NULL THEN 0
WHEN cte.StartTime IS NULL AND ( SELECT COUNT ( * ) FROM cte AS c WHERE c.id < cte.id AND c.StartTime IS NOT NULL ) > 0 THEN 0
WHEN cte.StartTime IS NOT NULL THEN 0
ELSE 1
END AS Exclude
) AS x
WHERE
Exclude = 0
ORDER BY
[TimeStamp];
返回
+------------+-------------------------+-------------------------+
| InstanceID | TimeStamp | StartTime |
+------------+-------------------------+-------------------------+
| 6 | 2020-08-22 17:13:00.000 | 2020-08-22 17:30:00.000 |
+------------+-------------------------+-------------------------+
场景二
DECLARE @data table ( InstanceID int, [TimeStamp] datetime, StartTime datetime );
INSERT INTO @data VALUES
( 1, '08/22/2020 07:06:00', '08/22/2020 07:06:00' ),
( 2, '08/22/2020 12:30:00', NULL ),
( 4, '08/22/2020 14:32:00', NULL ),
( 6, '08/22/2020 17:13:00', '08/22/2020 17:30:00' );
WITH cte AS (
SELECT
ROW_NUMBER() OVER ( ORDER BY [TimeStamp] ) AS id,
InstanceID,
[TimeStamp],
StartTime
FROM @data
)
SELECT
InstanceID, [TimeStamp], StartTime
FROM cte
OUTER APPLY (
SELECT CASE
WHEN cte.id = 1 AND cte.StartTime IS NULL THEN 1
WHEN cte.id = 1 AND cte.StartTime IS NOT NULL THEN 0
WHEN cte.StartTime IS NULL AND ( SELECT COUNT ( * ) FROM cte AS c WHERE c.id < cte.id AND c.StartTime IS NOT NULL ) > 0 THEN 0
WHEN cte.StartTime IS NOT NULL THEN 0
ELSE 1
END AS Exclude
) AS x
WHERE
Exclude = 0
ORDER BY
[TimeStamp];
返回
+------------+-------------------------+-------------------------+
| InstanceID | TimeStamp | StartTime |
+------------+-------------------------+-------------------------+
| 1 | 2020-08-22 07:06:00.000 | 2020-08-22 07:06:00.000 |
| 2 | 2020-08-22 12:30:00.000 | NULL |
| 4 | 2020-08-22 14:32:00.000 | NULL |
| 6 | 2020-08-22 17:13:00.000 | 2020-08-22 17:30:00.000 |
+------------+-------------------------+-------------------------+
场景三
DECLARE @data table ( InstanceID int, [TimeStamp] datetime, StartTime datetime );
INSERT INTO @data VALUES
( 1, '08/22/2020 07:06:00', NULL ),
( 2, '08/22/2020 12:30:00', NULL ),
( 4, '08/22/2020 14:32:00', NULL );
WITH cte AS (
SELECT
ROW_NUMBER() OVER ( ORDER BY [TimeStamp] ) AS id,
InstanceID,
[TimeStamp],
StartTime
FROM @data
)
SELECT
InstanceID, [TimeStamp], StartTime
FROM cte
OUTER APPLY (
SELECT CASE
WHEN cte.id = 1 AND cte.StartTime IS NULL THEN 1
WHEN cte.id = 1 AND cte.StartTime IS NOT NULL THEN 0
WHEN cte.StartTime IS NULL AND ( SELECT COUNT ( * ) FROM cte AS c WHERE c.id < cte.id AND c.StartTime IS NOT NULL ) > 0 THEN 0
WHEN cte.StartTime IS NOT NULL THEN 0
ELSE 1
END AS Exclude
) AS x
WHERE
Exclude = 0
ORDER BY
[TimeStamp];
返回
+------------+-----------+-----------+
| InstanceID | TimeStamp | StartTime |
+------------+-----------+-----------+