Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 返回重叠日期时间记录_Sql_Sql Server 2008 - Fatal编程技术网

Sql 返回重叠日期时间记录

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

我试图获取数字相等且下一行的开始时间小于第一行的结束时间的记录,但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.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;