2010-11-22 208 views
3

多個記錄分割記錄我正在尋找一個解決方案,我必須使用來自另一個表中的數據的一個記錄創建一組記錄。表定義:在開始/結束日期

DECLARE A AS TABLE 
(
AID BIGINT NOT NULL, 
StartDate DATETIME NOT NULL, 
EndDate DATETIME 
) 

DECLARE B AS TABLE 
(
AID BIGINT NOT NULL, 
StartDate DATETIME NOT NULL, 
EndDate DATETIME NULL 
) 

的想法是,當A含有:

1 | 01-01-2010 | 01-02-2010 
2 | 01-10-2010 | 31-10-2010 

和B包含:

1 | 01-01-2010 | 15-01-2010 
2 | 15-10-2010 | 20-10-2010 

我們收到5條:

1 | 01-01-2010 | 15-01-2010 
1 | 16-01-2010 | 01-02-2010 
2 | 01-10-2010 | 15-10-2010 
2 | 16-10-2010 | 20-10-2010 
2 | 21-10-2010 | 31-10-2010 

目前我們用A和inne上的光標來做到這一點對B r的循環光標,我們不得不這樣做在SQLServer的(TSQL或在最壞的情況下,CLR)

如何編寫這是一個選擇,使光標的開銷消失任何想法?

+0

目前尚不清楚生成5條記錄的規則是什麼。說明你想在英語 – smirkingman 2010-11-22 13:13:09

+0

實現什麼?答有時間,B中有「子」期,期間的foreach B中,我們需要拆分在一個時期 – 2010-11-22 13:41:12

回答

2
DECLARE @A TABLE (AID BIGINT NOT NULL, StartDate DATETIME NOT NULL, EndDate DATETIME) 
DECLARE @B TABLE (AID BIGINT NOT NULL, StartDate DATETIME NOT NULL, EndDate DATETIME NULL) 

SET DATEFORMAT dmy 
INSERT @A VALUES (1 ,'01-01-2010','01-02-2010') 
INSERT @A VALUES (2 ,'01-10-2010','31-10-2010') 
INSERT @B VALUES (1 ,'01-01-2010','15-01-2010') 
INSERT @B VALUES (2 ,'15-10-2010','20-10-2010') 

;WITH transitions as 
(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY AID ORDER BY startdate) Sequence 
    FROM (
     SELECT A.AID, A.startdate 
     FROM @a A 
     UNION 
     SELECT A.AID, B.startdate + 1 
     FROM @A A 
     INNER JOIN @b B ON B.startdate > A.startdate AND B.startdate < A.enddate 
     UNION 
     SELECT A.AID, B.enddate + 1 
     FROM @A A 
     INNER JOIN @b B ON B.enddate > A.startdate AND B.enddate < A.enddate 
     UNION 
     SELECT A.AID, A.enddate + 1 
     FROM @a A 
     WHERE A.enddate > A.startdate 
    ) T 
) 
SELECT T1.AID, T1.startdate startdate, T2.startdate - 1 enddate 
FROM transitions T1 
INNER JOIN transitions T2 ON T2.AID = T1.AID AND T2.Sequence = T1.Sequence + 1 
ORDER BY T1.AID, T1.Sequence 
相關問題