Получить максимальную дату из другой таблицы на основе даты текущей строки - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть две таблицы, CALL_DATA и MASTER_DATA.

Основные данные содержат ежедневные данные о клиенте, а CALL_DATA содержит некоторые звонки клиента и некоторые другие данные.Я хочу получить для каждого клиента и для каждого его ежедневного ряда в MASTER_DATA строку с самой последней датой (максимальной датой до сих пор) от CALL_DATA.

Я придумал следующее:

SELECT MAX(CALL_DATA.CALL_DATE) OVER (PARTITION BY MASTER_DATA.CUSTOMER_ID 
                                          ORDER BY MASTER_DATA.DAILY_START_DATE)
        AS max_date_agg
     , MASTER_DATA.*
     , CALL_DATA.*
  FROM MASTER_DATA, CALL_DATA
 WHERE CALL_DATA.CALL_DAT <= MASTER_DATA.DAILY_START_DATE 
   AND CALL_DATA.CUSTOMER_ID = MASTER_DATA.CUSTOMER_ID;

Но это возвращает мне больше одного живого за каждый день начала.Фактически он возвращает столько строк, сколько есть внутри CALL_DATA таблицы до DAILY_START_DATE в MASTER_DATA.

Пример:

   MAX_DATE_AGG             CUSTOMER_ID  DAILY_START_DATE
24/10/17 00:00:00,000000000 100664970   24/10/17 00:00:00
24/10/17 00:00:00,000000000 100664970   25/10/17 00:00:00
24/10/17 00:00:00,000000000 100664970   26/10/17 00:00:00
24/10/17 00:00:00,000000000 100664970   27/10/17 00:00:00
24/10/17 00:00:00,000000000 100664970   28/10/17 00:00:00
24/10/17 00:00:00,000000000 100664970   29/10/17 00:00:00
24/10/17 00:00:00,000000000 100664970   30/10/17 00:00:00
24/10/17 00:00:00,000000000 100664970   31/10/17 00:00:00
24/10/17 00:00:00,000000000 100664970   01/11/17 00:00:00
24/10/17 00:00:00,000000000 100664970   02/11/17 00:00:00
24/10/17 00:00:00,000000000 100664970   03/11/17 00:00:00
24/10/17 00:00:00,000000000 100664970   04/11/17 00:00:00
24/10/17 00:00:00,000000000 100664970   05/11/17 00:00:00
24/10/17 00:00:00,000000000 100664970   06/11/17 00:00:00
24/10/17 00:00:00,000000000 100664970   07/11/17 00:00:00
24/10/17 00:00:00,000000000 100664970   08/11/17 00:00:00
24/10/17 00:00:00,000000000 100664970   09/11/17 00:00:00
24/10/17 00:00:00,000000000 100664970   10/11/17 00:00:00
24/10/17 00:00:00,000000000 100664970   11/11/17 00:00:00
24/10/17 00:00:00,000000000 100664970   12/11/17 00:00:00
24/10/17 00:00:00,000000000 100664970   13/11/17 00:00:00
24/10/17 00:00:00,000000000 100664970   14/11/17 00:00:00
15/11/17 00:00:00,000000000 100664970   15/11/17 00:00:00
15/11/17 00:00:00,000000000 100664970   15/11/17 00:00:00
15/11/17 00:00:00,000000000 100664970   16/11/17 00:00:00
15/11/17 00:00:00,000000000 100664970   16/11/17 00:00:00
15/11/17 00:00:00,000000000 100664970   17/11/17 00:00:00
15/11/17 00:00:00,000000000 100664970   17/11/17 00:00:00
15/11/17 00:00:00,000000000 100664970   18/11/17 00:00:00
15/11/17 00:00:00,000000000 100664970   18/11/17 00:00:00

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Этот запрос должен вернуть то, что вы хотите

SELECT T.*
  FROM (
          SELECT RANK() OVER (PARTITION BY MASTER_DATA.CUSTOMER_ID, MASTER_DATA.DAILY_START_DATE ORDER BY CALL_DATA.CALL_DATE DESC) AS myrank,
                MASTER_DATA.CUSTOMER_ID,
                MASTER_DATA.DAILY_START_DATE,
                CALL_DATA.CALL_DATE
           FROM MASTER_DATA,
                CALL_DATA
          WHERE CALL_DATA.CALL_DATE   <= MASTER_DATA.DAILY_START_DATE 
            AND CALL_DATA.CUSTOMER_ID = MASTER_DATA.CUSTOMER_ID
       ) T
 WHERE myrank = 1  
  ;
0 голосов
/ 30 ноября 2018

Вы можете преобразовать свой запрос в коррелированный подзапрос:

SELECT MASTER_DATA.*, (
    SELECT MAX(CALL_DATE)
    FROM CALL_DATA
    WHERE CALL_DATA.CUSTOMER_ID = MASTER_DATA.CUSTOMER_ID
    AND CALL_DATA.CALL_DAT <= MASTER_DATA.DAILY_START_DATE
) AS MOST_RECENT_CALL_TILL_NOW
FROM MASTER_DATA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...