2017-06-15 20 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つの重複するエントリがあり、3番目のエントリは重複していません。この結果から削除したいです。助けてください。 CTE、ROW_NUMBERと自己

+0

何?期待される成果は何でしょうか? –

+0

レコードのいずれかが他と重複している場合は、両方の重複レコードが結果内になければなりません。あなたの質問には、両方のペアが結果になるはずです。 –

+0

質問を投票した人は理由を挙げてください!!! –

答えて

0

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

訂正していただきありがとうございます。あなたの答えは部分的に...私はレコードが重複していますが、それは私にペアを与えません...それは重複レコードの1つだけを返します。 –

0

に参加するあなたのSQLクエリは、以下のことのようになります: `102`は、2つの重複レコードのペアを持っていた場合

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 
関連する問題