SQL 查询从多行递归返回一个结果

问题描述 投票:0回答:0

我有一个包含时间事件的表,在另一列中指定了方向。如果第一个事件与第二个事件相距超过 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

我要的是以下画面:

first step,

second step,

next step

expected result

sql sql-server recursion recursive-query
© www.soinside.com 2019 - 2024. All rights reserved.