У меня есть два запроса, первый возвращает некоторые данные из моей таблицы, второй запрос отображает все полчаса времени между двумя указанными датами. Есть ли способ сравнить результаты даты из запроса 1 из запроса 2 и объединить два результата вместе, когда дата из запроса 2 не существует в результате запроса 1.
Я прикреплю небольшую диаграмму, чтобы показать, что я имею в виду.
Запрос 1:
SELECT
reading_date,
reading_value
FROM DCM_READING
WHERE reading_date BETWEEN TO_DATE('17-NOV-2019' || ' 000000', 'DD-MON-YYYY HH24MISS')
AND TO_DATE('19-NOV-2019' || ' 235959', 'DD-MON-YYYY HH24MISS')
ORDER BY reading_date;
Запрос 2:
select TO_DATE('17-NOV-2019' || ' 000000', 'DD-MON-YYYY HH24MISS') +
( level / 48 ) dt
from dual
connect by level <= ( 48 + ( 48 *
( TO_DATE('19-NOV-2019' || ' 000000', 'DD-MON-YYYY HH24MISS') -
TO_DATE('17-NOV-2019' || ' 000000', 'DD-MON-YYYY HH24MISS') )
)
) ;
Вы можете перечислить временные метки, которые вы хотите в CTE, а затем принести таблицу с left join
:
with cte (reading_date) as (
select date '2020-11-17' from dual
union all
select reading_date + interval '30' minute
from cte
where reading_date + interval '30' minute < date '2020-11-19'
)
select c.reading_date, d.reading_value
from cte c
left join dcm_reading d on d.reading_date = c.reading_date
order by c.reading_date
Мне нравится использовать рекурсивные запросы, а не специфичный для Oracle синтаксис connect by
, потому что они являются стандартным SQL, но это в основном дело вкуса, логика остается прежней.
Это определенно больше похоже на то, что у меня было в голове - только все значения для всех периодов времени равны NULL, т.е. - d.reading_value не сохраняется в конечном результате.
@elszeus: это означало бы, что в dcm_reading
нет данных для дат, сгенерированных cte.
Да, ты прав - я поставил неправильную дату!! и спасибо также, я не знал, что подключение может достичь того же!
Все слышали об ошибке Y2k? Я не знаю, является ли «18 ноября 19» 18 ноября 2019 года или 19 ноября 2018 года. Хорошо, я могу сделать вывод из вашего фактического кода, но тогда это просто подчеркивает тот факт, что ваши даты хранятся в виде строк, а не ДАТЫ. Еще один конструктивный недостаток.