Соедините 2 таблицы на дату между 2 датами - PullRequest
0 голосов
/ 23 октября 2018

Я пытаюсь найти местоположение клиента на определенную дату и время в одной таблице и обновить другую таблицу.Я должен генерировать письма (PDF) с правильным адресом во время письма.У клиента есть запись движения в таблице, в которой указано, где он находился в определенную дату и время.Например, мы генерируем письмо клиенту AAA с датой 05.03.2016.Он должен иметь адрес местоположения LocA.Клиент BBB получает письмо с датой 22.05.2016, и он должен иметь местоположение LocE.Мне нужно обновить CustomerLetter.AddressLocation значением CustomerMovement.AddressLocation, и я не могу начать с этого.

Вот мои таблицы.

CREATE global temporary TABLE CustomerLetter (CustomerID varchar2(6), AddressLocation varchar2(6), LetterDate date);
INSERT INTO CustomerLetter (CustomerID, AddressLocation, LetterDate) VALUES ('AAA', NULL, '2016-05-03');
INSERT INTO CustomerLetter (CustomerID, AddressLocation, LetterDate) VALUES ('AAA', NULL, '2016-05-05');
INSERT INTO CustomerLetter (CustomerID, AddressLocation, LetterDate) VALUES ('AAA', NULL, '2016-08-14');
INSERT INTO CustomerLetter (CustomerID, AddressLocation, LetterDate) VALUES ('BBB', NULL, '2016-05-02');
INSERT INTO CustomerLetter (CustomerID, AddressLocation, LetterDate) VALUES ('BBB', NULL, '2016-05-29');
INSERT INTO CustomerLetter (CustomerID, AddressLocation, LetterDate) VALUES ('BBB', NULL, '2016-07-22');
INSERT INTO CustomerLetter (CustomerID, AddressLocation, LetterDate) VALUES ('CCC', NULL, '2016-03-06');
INSERT INTO CustomerLetter (CustomerID, AddressLocation, LetterDate) VALUES ('CCC', NULL, '2016-11-25');
commit;
CREATE global temporary TABLE CustomerMovement (CustomerID varchar2(6), ActionDate date, AddressLocation varchar2(6));
INSERT INTO CustomerMovement (CustomerID, AddressLocation, ActionDate) VALUES ('AAA', 'locA', TO_DATE('2016-05-02 09:05:00', 'yyyy-mm-dd HH24:MI:SS'));
INSERT INTO CustomerMovement (CustomerID, AddressLocation, ActionDate) VALUES ('AAA', 'locA', TO_DATE('2016-05-04 14:05:00', 'yyyy-mm-dd HH24:MI:SS'));
INSERT INTO CustomerMovement (CustomerID, AddressLocation, ActionDate) VALUES ('AAA', 'locB', TO_DATE('2016-05-04 22:00:00', 'yyyy-mm-dd HH24:MI:SS'));
INSERT INTO CustomerMovement (CustomerID, AddressLocation, ActionDate) VALUES ('AAA', 'locE', TO_DATE('2016-07-02 20:00:00', 'yyyy-mm-dd HH24:MI:SS'));
INSERT INTO CustomerMovement (CustomerID, AddressLocation, ActionDate) VALUES ('AAA', 'locA', TO_DATE('2016-06-03 06:10:00', 'yyyy-mm-dd HH24:MI:SS'));
INSERT INTO CustomerMovement (CustomerID, AddressLocation, ActionDate) VALUES ('BBB', 'locE', TO_DATE('2016-05-10 03:00:00', 'yyyy-mm-dd HH24:MI:SS'));
INSERT INTO CustomerMovement (CustomerID, AddressLocation, ActionDate) VALUES ('BBB', 'locF', TO_DATE('2016-06-01 03:00:00', 'yyyy-mm-dd HH24:MI:SS'));
INSERT INTO CustomerMovement (CustomerID, AddressLocation, ActionDate) VALUES ('CCC', 'locA', TO_DATE('2016-10-10 03:00:00', 'yyyy-mm-dd HH24:MI:SS'));
INSERT INTO CustomerMovement (CustomerID, AddressLocation, ActionDate) VALUES ('CCC', 'locA', TO_DATE('2016-12-03 03:00:00', 'yyyy-mm-dd HH24:MI:SS'));
commit;

1 Ответ

0 голосов
/ 23 октября 2018

Используйте подзапрос в вашем операторе UPDATE, чтобы запросить соответствующее значение addressLocation для каждой буквы.

Используя таблицы и данные, которые вы разместили в своем вопросе, это будет примерно так:

update CustomerLetter cl
SET addresslocation = ( SELECT cm.addressLocation  
                        FROM   CutomerMovement cm
                        WHERE  cm.customerID = cl.customerID
                        AND    cm.actionDate <= cl.letterDate
                        ORDER BY cm.actionDate DESC
                        FETCH FIRST 1 ROW ONLY );

Для каждой буквы найдите движения клиентов, которые произошли до до letterDate.Затем используйте addressLocation из самых последних из этих перемещений.

Если до даты письма в письме нет записей о перемещениях клиентов, адрес для этого письма будет null.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...