どこからクエリを開始すればよいかよくわかりませんが、TEST_A と TEST_B の 2 つのテーブルがあります。
TEST_B には特定の ID の特定の日付範囲が含まれ、TEST_A には指定された ASSIGNMENT 値を持つ 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関数が頭に浮かびますが、適切に書き留める方法がわかりません。ありがとう。
追加: ストアド プロシージャがこれを処理する柔軟性を提供する場合、それは依然として受け入れられるソリューションです。