как получить максимальную запись, когда условие Between соответствует двум записям в таблице?

#sql #oracle #oracle11g #oracle10g #oracle-sqldeveloper

#sql #Oracle #oracle11g #oracle10g #oracle-sqldeveloper

Вопрос:

 with tb as(
select 1 as PPT_FROM,40 PPT_TO from dual
union
select 15 as PPT_FROM,40 PPT_TO from dual)
select * from tb
where 40 between PPT_FROM and PPT_TO;
  

теперь ввод 40 или 15 соответствует обоим диапазонам дат, поэтому я хочу получить максимальную запись, то есть 15 PPT_from и 40 PPT_to

введите описание изображения здесь

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

1. Пожалуйста, покажите нам ожидаемые результаты.

2. Оба FROM и TO являются зарезервированными словами ( en.wikipedia.org/wiki/SQL_reserved_words ), т. Е. эти идентификаторы должны быть разделены как "FROM" и "TO" .

Ответ №1:

Я думаю, вы хотите order by и fetch :

 select *
from tb
where 40 between FROM and TO
order by from desc
fetch first 1 row only;
  

В старых версиях Oracle (до 12) вам нужен подзапрос:

 select tb.*
from (select tb.*
      from tb
      where 40 between FROM and TO
      order by from desc
     ) tb
where rownum = 1;
  

Обратите внимание, что FROM и TO — очень плохие имена для столбцов, потому что они являются ключевыми словами SQL.

Ответ №2:

Ожидаемые результаты могут быть достигнуты с помощью простого оператора GROUP BY

Запрос

 WITH
    tb
    AS
        (SELECT 1 AS PPT_FROM, 40 PPT_TO FROM DUAL
         UNION
         SELECT 15 AS PPT_FROM, 40 PPT_TO FROM DUAL)
  SELECT MAX (ppt_from) AS ppt_from, ppt_to
    FROM tb
   WHERE 40 BETWEEN PPT_FROM AND PPT_TO
GROUP BY ppt_to;
  

Результаты

 PPT_FROM | PPT_TO
-----------------
15       | 40