我有一个包含时间事件的表,在另一列中指定了方向。如果第一个事件与第二个事件相距超过 15 分钟,则它保持在第一个,否则保持在第二个。在下一步中,剩余的事件必须以相同的方式与第三个进行比较,依此类推,直到只剩下一个。
这是一个示例表:
DECLARE @srcTable TABLE
(
[Id] [bigint] NOT NULL,
[DayPart] [date] NULL,
[DIR] [varchar](3) NULL,
[EventTime] [datetimeoffset](7) NOT NULL
)
INSERT INTO @srcTable VALUES
(3738982, CAST(N'2023-03-01' AS Date), N'IN', CAST(N'2023-03-01T07:29:11.0000000+01:00' AS DateTimeOffset)),
(3768988, CAST(N'2023-03-01' AS Date), N'IN', CAST(N'2023-03-01T07:40:11.0000000+01:00' AS DateTimeOffset)),
(3768063, CAST(N'2023-03-02' AS Date), N'OUT', CAST(N'2023-03-02T18:58:57.0000000+01:00' AS DateTimeOffset)),
(3763125, CAST(N'2023-03-02' AS Date), N'OUT', CAST(N'2023-03-02T14:01:48.0000000+01:00' AS DateTimeOffset)),
(3763140, CAST(N'2023-03-02' AS Date), N'IN', CAST(N'2023-03-02T14:02:10.0000000+01:00' AS DateTimeOffset)),
(3764277, CAST(N'2023-03-02' AS Date), N'IN', CAST(N'2023-03-02T15:00:40.0000000+01:00' AS DateTimeOffset)),
(3752484, CAST(N'2023-03-01' AS Date), N'OUT', CAST(N'2023-03-01T16:51:52.0000000+01:00' AS DateTimeOffset)),
(3754881, CAST(N'2023-03-02' AS Date), N'IN', CAST(N'2023-03-02T07:30:32.0000000+01:00' AS DateTimeOffset)),
(3747071, CAST(N'2023-03-01' AS Date), N'IN', CAST(N'2023-03-01T12:56:55.0000000+01:00' AS DateTimeOffset)),
(3747176, CAST(N'2023-03-01' AS Date), N'IN', CAST(N'2023-03-01T12:59:45.0000000+01:00' AS DateTimeOffset))
和 cte 显示行中事件之间的时间差异。
;WITH cte1 AS
(
SELECT
*,
LEAD(EventTime, 1) OVER (PARTITION BY DayPart ORDER BY EventTime) AS NextTime
FROM
@srcTable
)
SELECT
*,
CAST(DATEADD(SECOND,DATEDIFF(SECOND, EventTime, NextTime),0) AS TIME(0)) AS DIFF
FROM
cte1
ORDER BY
DayPart, EventTime
我要的是以下画面: