Возможно ли объединить эти два запроса вместе, кроме использования временных таблиц?

#sql #oracle

#sql #Oracle

Вопрос:

Запрос 1:

 SELECT MAX(START_DATE) AS HIGHEST_DT
FROM T;
  

Запрос 2:

 SELECT
START_DATE AS LOWER_DT
FROM T
WHERE END_DATE = HIGHEST_DT;
  

Я надеюсь получить что-то вроде

 START_DATE HIGHEST_DT
  

Ответ №1:

Итак, кажется, у вас есть таблица t с двумя столбцами start_date и end_date (и, возможно, больше столбцов); вы хотите найти самую последнюю (максимальную) начальную дату, а затем найти все строки, где конечная дата равна этому max(start_date) , верно?

Один из способов (не тестировался, поскольку вы не предоставили тестовые данные):

 select start_date as lower_dt,  highest_dt
from   (select start_date, end_date, max(start_date) over () as highest_dt
        from   t)
where  end_date = highest_dt;
  

Комментарии:

1. @Mr.Maze — Если у вас большой объем данных, вы можете протестировать оба решения и посмотреть, какое из них более эффективно. Во многих случаях аналитические функции (которые я использовал в своем решении) работают быстрее, но не всегда.

2. Спасибо, я столкнулся с 5M recs. Ваш запрос выполняется немного быстрее.

3. @Mr.Maze — {:-) Рад, что это сработало для вас, но если бы это было немного быстрее, вы должны оставить отметку «Правильный ответ» в решении Prdp. (И в любом случае, по крайней мере, поддержите его, хотя справедливым решением было бы оставить его как правильный ответ и, возможно, поддержать мой, если вы сочтете это полезным.) Со временем вы изучите эти правила, хотя главное правило, на самом деле, заключается в том, что вы можете отмечать ответы любым способом, который считаете правильным.

Ответ №2:

Вот один из способов использования Sub-Query

 SELECT
START_DATE AS LOWER_DT,END_DATE as HIGHEST_DT
FROM T
WHERE END_DATE = (SELECT MAX(START_DATE) FROM T)
  

Комментарии:

1. Мне бы очень хотелось иметь оба столбца HIGHEST_DT и LOWER_DT