我有一个记录用户访问的数据库。请求用户访问,并为用户提供两小时的时间来访问其空间。目前,用户可以请求多个请求,这些请求有时会重叠。我们还记录他们访问该空间的时间。如果一个用户有多个请求并且相互重叠,我需要将它们合并到最后一个时间窗口的最早时间和最晚时间。
这里有一些代码用于创建一些示例数据来说明我的问题。我还附上了一张图片,说明了期望的结果:
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
我尝试过滞后和超前函数,但没有达到预期的结果。有人可以帮忙吗?
我在下面创建了一个查询,以了解哪两个票证重叠及其组合的 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;