#sql #postgresql
#sql #postgresql
Вопрос:
У меня есть следующий код:
Select * from table
where to_date <= ( select max(to_date)
FROM table)
and to_date >= (select (max(to_date)::date - interval '6 months')::date as to_date
FROM table)
В принципе, я пытаюсь просмотреть все результаты между максимальной датой и затем 6 месяцами в прошлом, и я попытался сделать это, выполнив 2 подзапроса.
Кажется, я получаю null, но, как ни странно, если добавить обычную дату, которая
(select (max(to_date)::date - interval '6 months')::date
выдает и вставляет его как >='yyyy-mm-dd'
, запрос, похоже, работает нормально. Это странно, поскольку оба подзапроса фактически выдают результаты формата даты и понятия не имеют, почему это происходит.
Комментарии:
1. Почему вы приводите значение во втором запросе к
date
, но не в первом?2. Что вы имеете в виду под «не работает»?
Ответ №1:
Вам не нужны оба сравнения:
select *
from table
where to_date >= (select (max(to_date)::date - interval '6 months')::date as to_date
from table
) ;
Предполагается, что ссылка на таблицу одинакова как во внутреннем, так и во внешнем запросе.
Ответ №2:
Я не могу придумать причину, по которой это не сработало бы, но вы можете переписать запрос, чтобы запускать только один подзапрос, что также более эффективно:
select t.*
from the_table t
cross join (
select max(the_date) as max_date
from the_table
) mt
where t.to_date <= mt.max_date
and t.to_date >= mt.max_date - interval '6 months'
Комментарии:
1. Достаточно странно, что при предложенном вами подходе я получаю тот же нулевой результат (и нет, он не должен быть нулевым, у меня есть данные за 6 месяцев)
2. Это может быть только
null
, если таблица вообще не содержит строк.