将重叠的时间范围(最小和最大)合并为一个,如果检测时间标准匹配,则将一揽子分配给相关用户

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

我有一个记录用户访问的数据库。请求用户访问,并为用户提供两小时的时间来访问其空间。目前,用户可以请求多个请求,这些请求有时会重叠。我们还记录他们访问该空间的时间。如果一个用户有多个请求并且相互重叠,我需要将它们合并到最后一个时间窗口的最早时间和最晚时间。

这里有一些代码用于创建一些示例数据来说明我的问题。我还附上了一张图片,说明了期望的结果:desired outcome

CREATE TABLE #temp (
    Ticketnumber int,
    UserID varchar(20),
    DetectionTime datetime,
    TimeWindowStart datetime,
    TimeWindowEnd datetime)

insert into #temp (Ticketnumber ,UserID, DetectionTime, TimeWindowStart, TimeWindowEnd)
VALUES
('567270', 'mark', '2022-12-15 08:42:28.000', '2022-12-15 08:38:46.000', '2022-12-15 10:53:56.000'),
('567270', 'mark', '2022-12-15 09:34:52.000', '2022-12-15 08:38:46.000', '2022-12-15 10:53:56.000'),
('578596', 'mark', '2022-12-15 09:29:37.000', '2022-12-15 09:09:28.000', '2022-12-15 11:24:33.000'),
('578596', 'mark', '2022-12-15 09:35:37.000', '2022-12-15 09:09:28.000', '2022-12-15 11:24:33.000'),
('578596', 'mark', '2022-12-15 09:34:52.000', '2022-12-15 09:09:28.000', '2022-12-15 11:24:33.000'),
('045611', 'mark', '2023-02-01 16:13:42.000', '2023-02-01 15:56:41.000', '2023-02-01 18:11:43.000'),
('626948', 'anna', '2022-12-20 13:18:20.000', '2022-12-20 11:33:25.000', '2022-12-20 13:48:32.000'),
('626948', 'anna', '2022-12-20 12:06:40.000', '2022-12-20 11:33:25.000', '2022-12-20 13:48:32.000'),
('626948', 'anna', '2022-12-20 13:15:39.000', '2022-12-20 11:33:25.000', '2022-12-20 13:48:32.000'),
('627361', 'anna', '2022-12-20 13:18:20.000', '2022-12-20 11:33:31.000', '2022-12-20 13:48:34.000'),
('627361', 'anna', '2022-12-20 12:17:43.000', '2022-12-20 11:33:31.000', '2022-12-20 13:48:34.000'),
('627361', 'anna', '2022-12-20 13:07:31.000', '2022-12-20 11:33:31.000', '2022-12-20 13:48:34.000'),
('627361', 'anna', '2022-12-20 12:06:40.000', '2022-12-20 11:33:31.000', '2022-12-20 13:48:34.000'),
('627361', 'anna', '2022-12-20 13:15:39.000', '2022-12-20 11:33:31.000', '2022-12-20 13:48:34.000')

SELECT Ticketnumber, Userid, [detectiontime], TimeWindowStart,     TimeWindowEnd,
     Lag([timewindowstart], 1) OVER(
       ORDER BY userid, TimeWindowStart ASC) AS LagStartDate,
     Lead([TimewindowEnd], 1) OVER(
       ORDER BY userid, [TimewindowEnd] ASC) AS LagEndDate
from #temp t2
order by userid, TimeWindowStart

我尝试过滞后和超前函数,但没有达到预期的结果。有人可以帮忙吗?

sql datetime lag overlapping lead
1个回答
0
投票

我在下面创建了一个查询,以了解哪两个票证重叠及其组合的 TimeWindowStart 和 TimeWindowEnd。它不完全是您想要的格式,但您可以在此处使用它。

在上表中,即使是 Anna,票号 627361 和 626948 之间也有重叠。

限制:如果超过2张票重叠怎么办?

WITH cte AS ( SELECT Ticketnumber, Userid, [detectiontime], TimeWindowStart,     TimeWindowEnd,
     Lag([timewindowstart], 1) OVER(
       ORDER BY userid, TimeWindowStart ASC) AS LagStartDate,
     Lead([TimewindowEnd], 1) OVER(
       ORDER BY userid, [TimewindowEnd] ASC) AS LagEndDate,
      Lag([userid], 1) OVER(
           ORDER BY userid, TimeWindowStart ASC) AS Laguserid,
      Lag([ticketnumber], 1) OVER(
           ORDER BY userid, TimeWindowStart ASC) AS Lagticketnumber
    from #temp t2

) 
select ticketnumber,lagticketnumber, userid
    , LagStartDate as TimeWindowStart
    , LagEndDate as TimeWindowEnd, 
    IIF(cte.userid = cte.laguserid 
       and cte.TimeWindowStart <> cte.LagStartDate
       and TimeWindowStart between LagStartDate and LagEndDate
       , 1, 0) is_overlap 
from cte 
where IIF(cte.userid = cte.laguserid 
   and cte.TimeWindowStart <> cte.LagStartDate
   and TimeWindowStart between LagStartDate and LagEndDate
   , 1, 0) = 1
order by userid, TimeWindowStart;

输出:

© www.soinside.com 2019 - 2024. All rights reserved.