SQL - Between 条件がテーブル内の 2 つのレコードに一致する場合に最大レコードを取得するにはどうすればよいですか?

okwaves2024-01-25  8

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 を取得したい

期待される結果を示してください。

– Vボカ

2020 年 9 月 3 日 11:47

FROM と TO は両方とも予約語 (en.wikipedia.org/wiki/SQL_reserved_words) です。つまり、これらの識別子にはd は「FROM」で区切ります。と「TO」。

– ジャール

2020 年 9 月 3 日 11:48



------------------------

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 キーワードであるため、列の名前としては非常に不適切であることに注意してください。



------------------------

再期待する結果は、単純な 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

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。