質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Oracle Database

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

375閲覧

未来のデータがなければ過去のデータを取得するSQLを教えていただきたいです。

usagi518

総合スコア18

Oracle Database

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

1クリップ

投稿2019/01/16 01:12

編集2019/01/16 01:52

入荷日   商品名 価格 産地
2019/4/1 りんご 100 千葉
2019/5/1 りんご 80 千葉
2019/6/1 りんご 120 山梨
2019/4/1 ばなな 100 エクアドル
2019/5/1 ばなな 200 沖縄
2019/4/1 メロン 600 北海道

現在日付が2019/4/10とします。
未来の入荷日がある場合、現在日付に最も近いデータを取得します。
また未来の入荷日がない場合、過去のデータを取得します。

入荷日   商品名 価格 産地
2019/5/1 りんご 80 千葉
2019/5/1 ばなな 200 沖縄
2019/4/1 メロン 600 北海道

このようなデータをSQLで出したいのですが、よいやり方はありますでしょうか。
どうかお力をお貸しください。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2019/01/16 01:24

DBMSを明記して下さい
usagi518

2019/01/16 01:42

見ていただきありがとうございます! DBMSはOracle Databaseです。 よろしくお願いいたします!
sazi

2019/01/16 01:48

タグに追加した方が良いですね
usagi518

2019/01/16 01:53

ご指摘ありがとうございます! タグに追加いたしました
guest

回答3

0

ベストアンサー

相関サブクエリーで未来と過去それぞれを抽出し、coalesceで優先判断

SQL

1with 入荷履歴 as( 2 select '2019-04-01' as 入荷日 ,'りんご' as 商品名,'100' as 価格,'千葉' as 産地 from dual 3 union all select '2019-05-01','りんご','80','千葉' from dual 4 union all select '2019-06-01','りんご','120','山梨' from dual 5 union all select '2019-04-01','ばなな','100','エクアドル' from dual 6 union all select '2019-05-01','ばなな','200','沖縄' from dual 7 union all select '2019-04-01','メロン','600','北海道' from dual 8) 9select * from 入荷履歴 t 10where 入荷日 = ( 11 select coalesce( 12 (select min(入荷日) from 入荷履歴 where 入荷日>'2019-04-10' and 商品名=t.商品名) 13 , (select max(入荷日) from 入荷履歴 where 入荷日<='2019-04-10' and 商品名=t.商品名) 14 ) from dual 15 )

※with式はテーブルの代わり

追記

もったいないので、yambejpさんのも

SQL

1with 入荷履歴 as( 2 select '2019-04-01' as 入荷日 ,'りんご' as 商品名,'100' as 価格,'千葉' as 産地 from dual 3 union all select '2019-05-01','りんご','80','千葉' from dual 4 union all select '2019-06-01','りんご','120','山梨' from dual 5 union all select '2019-04-01','ばなな','100','エクアドル' from dual 6 union all select '2019-05-01','ばなな','200','沖縄' from dual 7 union all select '2019-04-01','メロン','600','北海道' from dual 8) 9select * from 入荷履歴 10where (入荷日,商品名) in ( 11 select min(入荷日),商品名 from 入荷履歴 where 入荷日>='2019-04-10' group by 商品名 12 union 13 select max(入荷日),商品名 from 入荷履歴 group by 商品名 having max(入荷日)<'2019-04-10' 14 )

投稿2019/01/16 02:16

編集2019/01/16 02:44
sazi

総合スコア25138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

usagi518

2019/01/16 02:40

素晴らしいご回答をありがとうございます!! 大変助かりました、本当にありがとうございます!
usagi518

2019/01/16 04:04

ご親切にありがとうございます! havingにMAXが使えることを初めて知りました。 とても勉強になりました!
guest

0

こんな感じですか

SQL

1create table tbl(id int primary key,nyuka date,shohin varchar(20),kakaku int,sanchi varchar(20)); 2insert into tbl values 3(1,'2019-04-01','りんご','100','千葉'), 4(2,'2019-05-01','りんご','80','千葉'), 5(3,'2019-06-01','りんご','120','山梨'), 6(4,'2019-04-01','ばなな','100','エクアドル'), 7(5,'2019-05-01','ばなな','200','沖縄'), 8(6,'2019-04-01','メロン','600','北海道'); 9 10select * from tbl as t1 11where (nyuka,shohin) in ( 12select min(nyuka),shohin from tbl where nyuka>='2019-04-10' group by shohin 13union 14select max(nyuka) as max_nyuka,shohin from tbl 15group by shohin having max_nyuka<'2019-04-10' 16);

投稿2019/01/16 01:39

yambejp

総合スコア114572

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

usagi518

2019/01/16 02:41

ご回答いただきありがとうございます! 大変参考にさせていただきました!
guest

0

SQL

1select * from (select * from t where t.dat > now() order by t.dat desc limit 1) as f 2union 3select * from( select * from t where t.dat <= now() order by t.dat asc limit 1) as p 4order by dat desc limit 1;

投稿2019/01/16 01:27

編集2019/01/16 01:40
papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2019/01/16 01:29

今回は「未来でも過去でも近い方優先」ではなくて、「未来があれば(遠くても)優先」なので、ちょっと違いますね
papinianus

2019/01/16 01:39

ご指摘のとおりでしたので、改めました。
papinianus

2019/01/16 02:17

ごめんなさい。mysqlで書いてます。
usagi518

2019/01/16 02:43

いいえとんでもないことです! mysqlであればこのように書けるのだなと大変勉強になりました! ご回答いただきありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問