2017-06-15 36 views
-1

我有一個表和查詢如下: 我想獲得[Assignment Start Date][Assignment End Date]之間的重疊記錄相同的Employee Id。 總之,我需要那些從下面的例子中分配相同時間段或重疊時間段的那些Employee Id的數據。 例如如何根據開始和結束日期獲取重疊記錄?

[Employee Id] [Assignment Start Date]  [Assignment End Date] [Allocation Percentage] 

     100    2016-03-01     2017-02-28    100 
     102    2016-06-01     2016-12-31    100 
     102    2016-07-01     2016-10-30    100 
     102    2016-11-01     2017-01-31    100 
     103    2017-02-01     2017-05-30    100 
     102    2017-04-01     2017-06-30    100 
     102    2017-11-01     2017-01-31    100 
     104    2017-02-01     2017-05-01    100 



CREATE TABLE #Result 
(
PK INT IDENTITY(1,1), 
[BU] VARCHAR(20), 
[Division] VARCHAR(20), 
[Product Name] VARCHAR(30), 
[Employee ID] NVARCHAR(20), 
[Resource Name] VARCHAR(50), 
[Resource_ID] INT, 
[Assignment Start Date] DATE, 
[Assignment End Date] DATE, 
[Allocation Percentage] INT, 
[Location] VARCHAR(100), 
[Development Manager] VARCHAR(50), 
[Allocation] VARCHAR(20) 
); 


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 

INNER JOIN #Result r2 
ON r1.[Employee ID] = r2.[Employee ID] 
AND (r1.PK <> r2.PK) 
AND ((r1.[Assignment Start Date] <= r2.[Assignment Start Date]) AND (r1.[Assignment End Date] >= r2.[Assignment Start Date])) 
OR ((r1.[Assignment Start Date] > r2.[Assignment Start Date] AND r1.[Assignment Start Date] <= r2.[Assignment End Date]) AND (r1.[Assignment End Date] <= r2.[Assignment End Date])) 
OR ((r1.[Assignment Start Date] > r2.[Assignment Start Date] AND r1.[Assignment Start Date] <= r2.[Assignment End Date]) AND (r1.[Assignment End Date] > r2.[Assignment End Date])) 
OR (r1.[Assignment Start Date] = r2.[Assignment End Date]) 

我一直在使用上面的查詢嘗試,但它提供了有關重疊的員工,即使該員工該條目不重疊的所有記錄。

在上面的例子中有一個Employee Id102它有2個重疊的條目和第三個不重疊的條目我想從這個結果中刪除它。請幫忙。

+0

如果'102'有一對兩個重疊的記錄?你的預期產出是多少? –

+0

如果任何記錄與其他記錄重疊,那麼兩個重疊記錄應該在結果中。不應出現重疊。對你的問題這兩個對都應該是結果。 –

+0

有誰投下了這個問題,請給出一個理由! –

回答

0

CTE,ROW_NUMBER和自加入

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 
+0

它說無效列名'rn'@ t2.rn = t1.rn + 1 –

+0

@NikhilPatel我的不好,我沒有正確引用CTE。編輯 – JohnHC

+0

感謝您的糾正..您的答案工作,但部分...我越來越重疊的記錄,但它不給我配對...它只返回重疊記錄之一。 –

0

你的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 
相關問題