Sql 返回重叠日期时间记录
我试图获取数字相等且下一行的开始时间小于第一行的结束时间的记录,但UID不同 这是我工作的桌子 这是我试图获得的输出: 以下是我到目前为止的想法。此查询返回额外的行Sql 返回重叠日期时间记录,sql,sql-server-2008,Sql,Sql Server 2008,我试图获取数字相等且下一行的开始时间小于第一行的结束时间的记录,但UID不同 这是我工作的桌子 这是我试图获得的输出: 以下是我到目前为止的想法。此查询返回额外的行 ;WITH CTE AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY NUMBER ORDER BY STARTTIME) AS rownum FROM CALLS ) SELECT r1.* FROM CTE r1 inner join CTE r2 on r1.ro
;WITH CTE AS
(
SELECT *, ROW_NUMBER() OVER (PARTITION BY NUMBER ORDER BY STARTTIME)
AS rownum
FROM CALLS
)
SELECT r1.* FROM CTE r1 inner join CTE r2
on r1.rownum = r2.rownum
and r1.number = r2.number
and r2.starttime < r1.endtime
对如何修复此查询有何建议?您可以使用滞后/超前来获取上一个/下一个记录数据:
SELECT *
FROM calls
WHERE number IN (SELECT r1.number
FROM calls r1
CROSS JOIN calls r2
WHERE r2.starttime < r1.endtime
AND r1.number = r2.number
GROUP BY r1.number
HAVING Count(1) > 1)
您想要重叠,还是仅仅基于开始时间?例如,可以有多个彼此不重叠的记录,但重叠的跨度要大得多。旁注:你的结束时间应该在这个时间之前是独占的,而不是的最后一刻,如果他们还没有。
;WITH CTE AS
(
SELECT
ID
,UID
,NUMBER
,StartTime
,EndTime
,LAG(EndTime) OVER(PARTITION BY Number ORDER BY StartTime) AS PrevEndTime
,LAG(UID) OVER(PARTITION BY Number ORDER BY StartTime) AS PrevUID
,(SELECT COUNT(Number) FROM CALLS c1 WHERE c1.Number = c.Number) AS Counter
FROM CALLS c
)
SELECT
ID
,UID
,NUMBER
,StartTime
,EndTime
FROM CTE
WHERE (StartTime < PrevEndTime OR PrevEndTime IS NULL)
AND (PrevUID <> UID OR PrevUID IS NULL)
AND Counter > 1
ORDER BY ID;