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

Мне нужно было заполнить пробелы между датами, поэтому я получил этот SQL-запрос:

select * from (
  SELECT null as ID, to_date('15/08/28', 'yy/mm/dd') + ROWNUM - 1 as DATE_OF_RATE, null as VALUE, null as CURRENCY_ID
  FROM dual
  CONNECT BY LEVEL <= to_date('15/09/05', 'yy/mm/dd') - to_date('15/08/28', 'yy/mm/dd') + 1
) empCur
left join CURRENCY_RATE cr on TRUNC(empCur.DATE_OF_RATE) = (cr.DATE_OF_RATE)
AND cr.currency_id = 4;

enter image description here Вместо жестко закодированных дат выше, мне нужно передать мин и макс date_of_rate из currency_rate таблицы.Так что я попробовал это, но я получил другой результат:

select * from (
  SELECT null as ID, (select min(date_of_rate) from currency_rate) + ROWNUM - 1 as DATE_OF_RATE, null as VALUE, null as CURRENCY_ID
  FROM dual
  CONNECT BY LEVEL <= (select max(date_of_rate) - min(date_of_rate) + 1 from currency_rate)
) empCur
left join CURRENCY_RATE cr on TRUNC(empCur.DATE_OF_RATE) = (cr.DATE_OF_RATE)
where cr.date_of_rate between to_date('15/08/28', 'yy/mm/dd') and to_date('15/09/05', 'yy/mm/dd')
AND cr.currency_id = 4;

enter image description here

Как вы можете видеть, это не заполняло пробелы между диапазонами дат.Возможно ли даже то, чего я пытаюсь достичь?

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Ваш запрос в основном в порядке.Проблема заключается в предложении where.Это условие должно быть в таблице first :

select *
from (select  null as ID, (select min(date_of_rate) from currency_rate) + ROWNUM - 1 as DATE_OF_RATE, null as VALUE, null as CURRENCY_ID
      from dual
      connect by level <= (select max(date_of_rate) - min(date_of_rate) + 1 from currency_rate)
     ) empCur left join
     CURRENCY_RATE cr
     on empCur.DATE_OF_RATE = cr.DATE_OF_RATE and
        cr.currency_id = 4
where empCur.DATE_OF_RATE >= date '2015-08-28' and
      empCur.DATE_OF_RATE <= date '2015-09-05' ;

Я не понимаю, почему TRUNC() необходимо.Если это так, просто добавьте его обратно.

0 голосов
/ 24 сентября 2018

Я считаю, что использование временных переменных может помочь.Вот что я бы сделал.Обратите внимание, что мой синтаксис, вероятно, шейкий, так как я делаю это по памяти.Некоторое легкое гугление поможет вам пройти весь путь.

Шаг 1. Создайте несколько временных переменных.Их нужно запустить одной командой.

DECLARE @MinDate DATETIME;
DECLARE @MaxDate DATETIME;

@MinDate = SELECT Min([DATE_OF_RATE]) FROM CURRENCY_RATE; 
@MaxDate = SELECT Max([DATE_OF_RATE]) FROM CURRENCY_RATE;

Шаг 2. Создайте таблицу календаря со всеми возможными датами, буквально указав дату в качестве единственного столбца.Сделайте это вручную, если вам нужно.Вы всегда можете создать таблицу календаря с днями до 2050 года, намного позже, когда эта система больше не будет использоваться.

Шаг 3. Соедините левый переход от таблицы календаря к таблице тарифов на дату.Это даст вам строку независимо от пробелов в ставках.

SELECT c.CalDate FROM Calendar c
LEFT JOIN CURRENCY_RATE cr
ON c.CalDate = cr.DATE_OF_RATE

Шаг 4. Отфильтруйте новую таблицу, где дата находится в диапазоне мин / макс, используя временную таблицу

SELECT c.CalDate FROM Calendar c
LEFT JOIN CURRENCY_RATE cr
ON c.CalDate = cr.DATE_OF_RATE
WHERE c.CalDate >= @MinDate AND c.CalDate <= @MaxDate

Надеюсь, это поможет.

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