不確定從何處開始查詢,但我有兩個表TEST_A和TEST_B。Oracle查詢填寫分組記錄之間的日差
TEST_B包含用於特定ID的特定日期範圍內,而TEST_A包含用於與所提供的分配值的ID的日期範圍。
下面是創建和填充表的DDL。
CREATE TABLE TEST_A
(
ID VARCHAR2(5),
START_DATE DATE,
END_DATE DATE,
ASSIGNMENT VARCHAR2(25)
)
STORAGE (
BUFFER_POOL DEFAULT
)
LOGGING
NOCOMPRESS
NOCACHE
NOPARALLEL
NOMONITORING;
CREATE TABLE TEST_B
(
ID VARCHAR2(5),
START_DATE DATE,
END_DATE DATE
)
STORAGE (
BUFFER_POOL DEFAULT
)
LOGGING
NOCOMPRESS
NOCACHE
NOPARALLEL
NOMONITORING;
和腳本來填充表:
INSERT INTO TEST_A(ID, START_DATE, END_DATE, ASSIGNMENT)
VALUES('A', TO_DATE('01/01/2010', 'MM/DD/YYYY'), TO_DATE('01/31/2010', 'MM/DD/YYYY'), 'Lot A');
INSERT INTO TEST_A(ID, START_DATE, END_DATE, ASSIGNMENT)
VALUES('A', TO_DATE('02/01/2010', 'MM/DD/YYYY'), TO_DATE('02/15/2010', 'MM/DD/YYYY'), 'Lot A');
INSERT INTO TEST_A(ID, START_DATE, END_DATE, ASSIGNMENT)
VALUES('A', TO_DATE('02/18/2010', 'MM/DD/YYYY'), TO_DATE('02/28/2010', 'MM/DD/YYYY'), 'Lot C');
INSERT INTO TEST_A(ID, START_DATE, END_DATE, ASSIGNMENT)
VALUES('A', TO_DATE('03/01/2010', 'MM/DD/YYYY'), TO_DATE('03/31/2010', 'MM/DD/YYYY'), 'Lot D');
INSERT INTO TEST_A(ID, START_DATE, END_DATE, ASSIGNMENT)
VALUES('B', TO_DATE('08/01/2010', 'MM/DD/YYYY'), TO_DATE('08/31/2010', 'MM/DD/YYYY'), 'Lot E');
INSERT INTO TEST_A(ID, START_DATE, END_DATE, ASSIGNMENT)
VALUES('B', TO_DATE('09/15/2010', 'MM/DD/YYYY'), TO_DATE('09/30/2010', 'MM/DD/YYYY'), 'Lot E');
INSERT INTO TEST_A(ID, START_DATE, END_DATE, ASSIGNMENT)
VALUES('C', TO_DATE('09/15/2010', 'MM/DD/YYYY'), TO_DATE('09/30/2010', 'MM/DD/YYYY'), 'Lot E');
INSERT INTO TEST_B(ID, START_DATE, END_DATE)
VALUES('A', TO_DATE('01/01/2010', 'MM/DD/YYYY'), TO_DATE('12/31/2099', 'MM/DD/YYYY'));
INSERT INTO TEST_B(ID, START_DATE, END_DATE)
VALUES('B', TO_DATE('08/01/2010', 'MM/DD/YYYY'), TO_DATE('12/31/2099', 'MM/DD/YYYY'));
INSERT INTO TEST_B(ID, START_DATE, END_DATE)
VALUES('C', TO_DATE('01/01/2010', 'MM/DD/YYYY'), TO_DATE('12/31/2099', 'MM/DD/YYYY'));
從數據上看,我需要一羣來自TEST_A這些記錄被分配,並在兩者之間填充缺失的一天的差距。每個ID的記錄還應涵蓋表TEST_B中提供的整個開始和結束日期。爲了進一步解釋,得出的數據,我需要是這樣的:
ID START_DATE END_DATE ASSIGNMENT
A 01/01/2010 02/15/2010 Lot A
A 02/16/2010 02/17/2010 {NULL}
A 03/01/2010 03/31/2010 Lot D
A 04/01/2010 12/31/2099 {NULL}
B 08/01/2010 08/31/2010 Lot E
B 09/01/2010 09/14/2010 {NULL}
B 09/15/2010 09/30/2010 Lot E
B 10/01/2010 12/31/2099 {NULL}
C 01/01/2010 09/14/2010 {NULL}
C 09/15/2010 09/30/2010 Lot E
C 10/01/2010 12/31/2099 {NULL}
欣賞構建查詢這方面的任何幫助。 LAG功能在腦海中浮現,但我不確定如何正確寫下它。謝謝。
增加: 如果存儲過程將在處理這提供了靈活性,那麼這仍然是一個接受的解決方案。
對於給定的ID,以後可以有很多重複的?例如,在ID = A可以從2010年4月重新出現「lot A」嗎?或地段A的日期將永遠是連續的? – DazzaL
對於每個給定的ID,有可能重複分配。 – Angelo
重複是好的,我的意思是如果我們添加這種複雜性: INSERT INTO TEST_A(ID,日期,結束日期,ASSIGNMENT) VALUES( 'A',TO_DATE('04/01/2010' , 'MM/DD/YYYY' ),TO_DATE('05/30/2010','MM/DD/YYYY'),'批次A'); 是有效的(所以在你的最終答案中,我們有兩個ID = A + ASSIGNMENT =批次A行 – DazzaL