2017-07-06 23 views
1

私が必要とするのは、互いに重複する可能性があるすべてのレコードを返すことです。私は私が見たサンプルコードからこれを試してみましたが、それは望ましい結果を返すされていない重複する日付の検索と重複レコードの検索

SubType Cause  CircuitID     BegDate EndDate AmtSought Remarks 
------------------- -------------------------- ---------- ---------- --------- -------- 
Original 201500018 36/KQ--/831670/IP /NUVX/ 2016-11-15 2016-12-14 100.25 Rec 3 
Original 201500018 36/KQ--/831670/IP /NUVX/ 2016-12-01 2016-12-31 354.41 Rec 1 
Original 201500018 36/KQ--/831670/IP /NUVX/ 2016-12-16 2017-01-15 300.75 Rec 4 
Original 201500018 36/KQ--/831670/IP /NUVX/ 2017-01-01 2017-01-01 500.00 Rec 5 

-- Create Temp Table 
CREATE TABLE #Overlap 

(SubType varchar(50), 
Cause varchar(9), 
CircuitID varchar(100), 
BegDate date, 
EndDate date, 
AmtSought decimal(11,2), 
Remarks varchar(max)) 

--Insert records 

INSERT INTO #Overlap VALUES('Original','201500018','36/KQ--/831670/IP /NUVX/','2016-12-01','2016-12-31',354.41,'Rec 1') 
INSERT INTO #Overlap VALUES('Original','201500009','36/VCID/826061/IP/NUVX','2016-08-11','2016-08-12',200.50,'Rec 2') 
INSERT INTO #Overlap VALUES('Original','201500018','36/KQ--/831670/IP /NUVX/','2016-11-15','2016-12-14',100.25,'Rec 3') 
INSERT INTO #Overlap VALUES('Original','201500018','36/KQ--/831670/IP /NUVX/','2016-12-16','2017-01-15',300.75,'Rec 4') 
INSERT INTO #Overlap VALUES('Original','201500018','36/KQ--/831670/IP /NUVX/','2017-01-01','2017-01-01',500.00,'Rec 5') 
INSERT INTO #Overlap VALUES('Original','201500009','36/VCID/826061/IP/NUVX','2016-07-01','2016-07-31',100.50,'Rec 6') 

私の結果は次のようになります。

あなた#Overlap表に主キー(または一意キー)を持っていると仮定すると
Select * from #Overlap a 
Inner Join #Overlap b 
on a.SubType = b.SubType 
And a.Cause = b.Cause 
And a.CircuitID = b.CircuitID 
And b.BegDate between a.BegDate and a.endDate 
And b.BegDate < a.endDate 

答えて

1

TableId

あなたはこの次のクエリ

SELECT * FROM #Overlap o 
WHERE EXISTS 
(
    SELECT 1 FROM #Overlap o2 
    WHERE o2.SubType = o.SubType 
    AND o2.Cause = o.Cause 
    AND o2.CircuitID = o.CircuitID 
    AND (
      o2.BegDate BETWEEN o.BegDate AND o.EndDate 
      OR o2.EndDate BETWEEN o.BegDate AND o.EndDate 
      OR o.BegDate BETWEEN o2.BegDate AND o2.EndDate 
      OR o.EndDate BETWEEN o2.BegDate AND o2.EndDate 
     ) 
    AND o2.TableId != o.TableId 
) 
ORDER BY o.SubType, o.Cause, o.BegDate 

デモリンク使用することができますとしてhttp://rextester.com/KBFX30109

を@ HABO提案、オーバーラップのチェックにも使用できます

AND o2.BegDate <= o.EndDate 
    AND o.BegDate <= o2.EndDate 
+0

ありがとうございます。ユニークキーを指摘していただきありがとうございます。私はそれをするのを忘れた。このコードは素晴らしいです! –

+0

ヒント:重複する範囲の一般的なチェックは、「Start1 <= End2 and Start2 <= End1'」です。 – HABO

+0

ありがとう@HABO。それはとても簡単です:) – TriV

2

開始オーバーラップと終了オーバーラップを確認する必要があります。 startdateが常にendDateより小さい場合、次のクエリを使用できます。主キーがある場合、CTEは必要ありません。

; WITH CTE AS 
(
    SELECT *, 
    ROW_NUMBER() OVER(
      PARTITION BY (SELECT NULL) 
      ORDER BY (SELECT NULL) 
    ) AS pk FROM #Overlap 
) 
SELECT a.*, b.pk, b.BegDate, b.endDate FROM CTE a 
CROSS JOIN CTE b 
WHERE -- Simplify by adding PK 
(a.pk <> b.pk) 
AND (CASE WHEN (a.BegDate > b.BegDate) THEN a.BegDate ELSE b.BegDate END) 
<= (CASE WHEN (a.endDate < b.endDate) THEN a.endDate ELSE b.endDate END) 
+0

私が望んでいた元の結果ではありませんでしたが、実際にどのレコードがテーブル内の他のレコードと競合しているかを分析するために別の結果を出しました。ありがとう。 –