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

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

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

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

SQL

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

Q&A

解決済

1回答

3186閲覧

【SQL】指定日付前後のデータ取得

退会済みユーザー

退会済みユーザー

総合スコア0

Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

SQL

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

0グッド

0クリップ

投稿2015/07/17 12:17

質問させてください

とあるテーブルがあります
構成は以下の通りです

key(varchar2)|date(varchar2)|value(number)
001|20150717|1
001|20150718|2
001|20150719|3
001|20150720|1
001|20150721|2
001|20150722|3
002|20150716|2
002|20150719|2
002|20150720|3
002|20150721|5
...

指定した日付以降の行をkeyで集約したvalueの和を取得
指定した日付より前で直近のdateのvalueを最大3つまで取得
この2つをkeyごとに1行ずつ取得

最終的な取得結果は以下のようにしたいです

指定日付:20150720の場合

key|直近日付3|直近値3|直近日付2|直近値2|直近日付1|直近値1|指定日付|指定日付以降の和
001|20150717|1|20150718|2|20150719|3|20150720|6
002|NULL|NULL(もしくは0)|20150716|2|20150719|2|20150720|8

自分で書いててもよくわからないのですが何か良い方法があればお教えください

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

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

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

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

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

guest

回答1

0

ベストアンサー

oracleが手元にないので試せないのですが、
こんな感じで取得できないでしょうか?

sql

1with AFTER_DATE as ( 2 select 3 key 4 , sum(value) val 5 from 6 test_table 7 where 8 date >= '20150720' 9 group by 10 key 11) 12, BEFORE_DATE as ( 13 select 14 key 15 , date 16 , value 17 , row_number over(partition by key1 order by date1 desc) as num 18 from 19 test_table 20 where 21 date1 < '20150720' 22) 23select 24 AFT.key 25 , AFT.val 26 , BEF3.date 27 , BEF3.value 28 , BEF2.date 29 , BEF2.value 30 , BEF1.date 31 , BEF1.value 32from 33 AFTER_DATE AFT 34 left outer join BEFORE_DATE BEF1 35 on AFT.key1 = BEF1.key1 36 and BEF1.num = 1 37 left outer join BEFORE_DATE BEF2 38 on AFT.key1 = BEF2.key1 39 and BEF2.num = 2 40 left outer join BEFORE_DATE BEF3 41 on AFT.key1 = BEF3.key1 42 and BEF3.num = 3

投稿2015/07/17 13:08

nyago_d

総合スコア178

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

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

退会済みユーザー

退会済みユーザー

2015/07/19 01:31

ご回答ありがとうございます 最大3つまで???というところで混乱していましたが ご回答いただいた内容そのままに使わせていただきます ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問