Sql 如何根据开始日期和结束日期仅获取重叠记录?

Sql 如何根据开始日期和结束日期仅获取重叠记录?,sql,sql-server-2014-express,Sql,Sql Server 2014 Express,我有一个表和查询,如下所示: 我正在尝试获取同一员工Id的[Assignment Start Date]和[Assignment End Date]之间的重叠记录。 简而言之,我需要以下示例中为相同时间段或重叠时间段分配的员工Id的数据。 e、 g 我曾尝试使用上述查询,但它会给出与重叠员工相关的所有记录,即使该员工的条目不重叠 在上面的示例中,有一个雇员Id 102,它有两个重叠的条目,第三个条目不重叠。我想从这个结果中删除它。请提供帮助。CTE、行号和自连接 with CTE as ( se

我有一个表和查询,如下所示: 我正在尝试获取同一员工Id的[Assignment Start Date]和[Assignment End Date]之间的重叠记录。 简而言之,我需要以下示例中为相同时间段或重叠时间段分配的员工Id的数据。 e、 g

我曾尝试使用上述查询,但它会给出与重叠员工相关的所有记录,即使该员工的条目不重叠


在上面的示例中,有一个雇员Id 102,它有两个重叠的条目,第三个条目不重叠。我想从这个结果中删除它。请提供帮助。

CTE、行号和自连接

with CTE as
(
select PK, Resource_ID, [Employee ID] as Emp_ID, [Assignment Start Date] as s_Date, [Assignment End Date] as e_date,
       row_number() over(partition by [Employee ID] order by  [Assignment Start Date] ) as rn
from #Result
)
select t1.*, t2.*
from CTE t1
inner join CTE t2
  on t1.Resource_ID = t2.Resource_ID
  and t1.Emp_ID = t2.Emp_ID
  and t2.rn = t1.rn +1
where t2.s_date <= t1.e_date 
or t1.e_date is null -- allows for null end date

您的SQL查询应该如下所示:

SELECT DISTINCT r1.PK, r1.Resource_ID,r1.[Employee ID], r1.[Assignment Start Date] AS 'Start 1' ,r1.[Assignment End Date] AS 'End 1' , r2.[Assignment Start Date] , r2.[Assignment End Date]
INTO #temp1
FROM #Result r1
JOIN #Result r2 on r1.[Employee ID] = r2.[Employee ID]
WHERE (
(r2.[Assignment Start Date]  BETWEEN r1.[Assignment Start Date]  and r1.[Assignment End Date])
or
(r2.[Assignment End Date] between p1.[Assignment Start Date]  and p1.[Assignment End Date])
)
AND r1.PK <> r2.PK  

如果102有一对重叠的记录呢?您期望的输出是什么?如果任何一条记录与另一条重叠,那么两条重叠的记录都应该是结果。。结果不应出现任何重叠。对于你的问题,两人都应该是结果。谁曾否决过这个问题,请给出一个理由!!!它表示无效的列名'rn'@t2.rn=t1.rn+1@NikhilPatel我的错,我没有正确引用CTE。编辑感谢您的更正。。你的回答起作用了,但有一部分。。。我得到了重叠的记录,但它没有给我一对。。。它只返回一个重叠记录。@NikhilPatel引用了第二盘CTE的第二遍,根据最新的编辑谢谢你的回答,我得到了我需要的。
SELECT DISTINCT r1.PK, r1.Resource_ID,r1.[Employee ID], r1.[Assignment Start Date] AS 'Start 1' ,r1.[Assignment End Date] AS 'End 1' , r2.[Assignment Start Date] , r2.[Assignment End Date]
INTO #temp1
FROM #Result r1
JOIN #Result r2 on r1.[Employee ID] = r2.[Employee ID]
WHERE (
(r2.[Assignment Start Date]  BETWEEN r1.[Assignment Start Date]  and r1.[Assignment End Date])
or
(r2.[Assignment End Date] between p1.[Assignment Start Date]  and p1.[Assignment End Date])
)
AND r1.PK <> r2.PK