查找重叠日期和 Return 重叠记录
Find Overlapping Dates and Return Overlapping Records
我需要的是return所有可能相互重叠的记录。
-- 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')
我的结果如下:
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
我已经从我看到的示例代码中进行了尝试,但它不是 return 想要的结果。
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
假设您的#Overlap table 有一个主键(或唯一键)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
演示 link:http://rextester.com/KBFX30109
作为@HABO的建议,你也可以使用检查重叠
AND o2.BegDate <= o.EndDate
AND o.BegDate <= o2.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)
我需要的是return所有可能相互重叠的记录。
-- 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')
我的结果如下:
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
我已经从我看到的示例代码中进行了尝试,但它不是 return 想要的结果。
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
假设您的#Overlap table 有一个主键(或唯一键)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
演示 link:http://rextester.com/KBFX30109
作为@HABO的建议,你也可以使用检查重叠
AND o2.BegDate <= o.EndDate
AND o.BegDate <= o2.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)